首页 理论教育 Linux驱动编写教程|模块加载实例

Linux驱动编写教程|模块加载实例

时间:2023-10-19 理论教育 版权反馈
【摘要】:可加载模块的makefile文件最重要的就是设置如下几个变量:CC=arm-none-linux-gnueabi-gccobj-m:=smodule.oKERNELDIR?=/root/fgj/linux-4.5.2CC是编译器,obj-m为需要编译的目标模块,KERNELDIR为内核路径。注意在编写可加载模块前先要有一个内核代码目录树。KERNELDIR的内核版本必须与运行的内核版本一致,否则编译出的模块往往无法加载。例1.1 最简单的内核模块代码见\samples\1door\1-1simple。建立正确的目录后,模块可以正常卸载。

Linux驱动编写教程|模块加载实例

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用来得到内核版本号。建立正确的目录后,模块可以正常卸载。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈