一、什么是内核模块
我们都知道linux内核采用的是宏内核架构,即大部分功能都在内核中实现,比如进程管理、内存管理、进程调度、设备管理等,都在特权模式下运行。而与之相反的是微内核架构,它把操作系统最基本的功能放在内核中,而其他大部分的功能(设备驱动等)都放到用户空间实现,两者相比,微内核架构有优越的动态扩展性。
linux内核在发展过程中引入了内核模块机制,这样在实际应用过程中就可以通过内核模块来实现动态添加和删除摸个功能。
二、如何编写一个内核模块
我们先猜想一下,既然可以动态增加模块,那么肯定需要通知内核新增的内核模块。删除也是要通知内核的。
以下为简单的内核模块结构。你在逗我,这么简单?
#include <linux/module.h>
#include <linux/init.h>
static int __init my_test_init(void)
{
printk(KERN_EMERG "my first kernel module init\n");
return 0;
}
static void __exit my_test_exit(void)
{
printk("goodbye\n");
}
module_init(my_test_init);
module_exit(my_test_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("PangHu");
MODULE_DESCRIPTION("my test kernel module");
MODULE_ALIAS("mytest");
三、详细分析内核模块
module_init()告诉内核这是这个模块的入口。一旦执行insmod就会执行my_test_init
module_exit()告诉内核这是这个模块的出口。一旦执行rmmod就会执行my_test_exit
MODULE_LICENSE()表示这个模块代码接受的软件许可协议
MODULE_AUTHOR()表示这个模块的作者
MODULE_DESCRIPTION()用来描述这个模块的用途或者功能
MODULE_ALIAS()为用户空间提供一个合适的别名
四、编译测试模块
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
加载模块
卸载模块
五、总结
模块加载函数:加载模块时,该函数会被自动执行,通常做一些初始化工作。
模块卸载函数:卸载模块时,该函数会被自动执行,做一些清理工作。
模块许可声明:内核模块必须声明许可证,否则内核会发出被污染的警告。
模块参数:根据需求来添加,为可选项。
模块作者和描述声明:一般都需要完善这些信息。
模块导出符号:根据需求来添加,为可选项。