第一个内核驱动
#include <linux/init.h>
#include <linux/module.h> //头文件
//入口函数
//static 限制函数的作用域
//int 返回值类型
//__init 告诉编译器应该将此段代码放在.init.text段中
//demo_init 入口函数的函数名
//void 函数没有参数,但是不能省略void,要不会报错
static int __init demo_init(void)
{
//printk 内核的打印函数,将内容显示到虚拟终端
//此处采用默认等级
//__FILE__ 在哪个文件
//__func__ 在哪个函数
//__LINE__ 在哪一行
printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
return 0;
}
//出口函数
//static 限制函数的作用域
//void 函数的返回值类型
//__exit 告诉编译器应该将此段函数放在.exit.text段中
//demo_exit 出口函数函数名
//void 函数没有参数,但是不能省略void,要不会报错
static void __exit demo_exit(void)
{
printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
}
module_init(demo_init);//告诉内核入口地址
module_exit(demo_exit);//告诉函数的出口地址
MODULE_LICENSE("GPL");//许可证,驱动遵从的开源协议
使用模块编译后,在安装驱动的时候会执行入口函数,入口函数一般是做资源的申请,初始化;在卸载驱动的时候会执行出口函数,一般是将入口函数申请的资源进行释放。