Linux内核模块必须包含以下两个接口:
module_init(your_init_func);//模块初始化接口
module_exit(your_exit_func);//模块卸载接口
加载一个内核模块的命令是insmod,格式如下:
#insmod modulename.ko
卸载一个内核模块的命令是rmmod,格式如下:
#rmmod modulename
可加载模块的源代码可以放在内核代码树中,也可以独立于内核代码树。如果是后一种情况,需要为可加载模块编写makefile文件。可加载模块的makefile文件最重要的就是设置如下几个变量:
CC=arm-none-linux-gnueabi-gcc(www.xing528.com)
obj-m:=smodule.o
KERNELDIR?=/root/fgj/linux-4.5.2
CC是编译器,obj-m为需要编译的目标模块,KERNELDIR为内核路径。注意在编写可加载模块前先要有一个内核代码目录树。KERNELDIR的内核版本必须与运行的内核版本一致,否则编译出的模块往往无法加载。
例1.1 最简单的内核模块
代码见\samples\1door\1-1simple。核心代码如下:
模块运行在内核态,不能使用用户态C库函数中的printf函数,而要使用printk函数打印调试信息。编写一个Makefile文件如下:
执行make后生成smodule.ko。运行结果如下:
第一次运行rmmod smodule会失败,因为需要在/lib/modules目录下建立以内核版本号为名称的目录,才能正确卸载模块。uname-r用来得到内核版本号。建立正确的目录后,模块可以正常卸载。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。