- 一、Linux内核模块简介
- 一个最简单的模块(module)
- 二、Linux内核模块程序结构
- 三、一个完整驱动源码
- Makefile文件
Linux内核的整体架构本就非常庞大,其包含的组件也非常多,而我们怎样把需要的部分都包含在内核中呢?
如果把需要的所有功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。
有没有另一种机制可使得编译出的内核本身并不需要包含所有功能,而这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?
Linux提供了这样的机制,这种机制被称为模块(module)。模块具有这样的特点。
- 模块本身不被编译人内核映像,从而控制了内核的大小。
- 模块一旦被加载,它就和内核中的其他部分完全一样。
#include#include static int __init hello_init(void) { printk(KERN_INFO "Hello World entern"); return 0; } module_init(hello_init); static void __exit hello_exit(void) { printk(KERN_INRO "Hello World exitn"); } module_exit(hello_exit); MODULE_AUTHOR("Lief Yuan "); MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("A simple Hello World Module"); MODULE_ALIAS("a simplest module");
这个最简单的内核模块只包含内核模块加载函数、卸载函数和对GPL v2 许可权限的声明以及一些描述信息。
二、Linux内核模块程序结构一个Linux内核模块主要由如下几个部分组成:
- (1)模块加载函数
当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。 - (2)模块卸载函数
当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相关的功能。 - (3)模块许可证声明
许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(Kernel Tainted)的警告。 - (4)模块参数(可选)
模块参数是模块被加载的时候可以传递给它的值,它本身对应模块内部的全局变量。 - (5)模块导出符号(可选)
内核模块可以导出的符号(symbol,对应于函数或变量),若导出,其他模块则可以使用本模块中的变量或函数。 - (6)模块作者等信息声明(可选)
详细参考:嵌入式Linux–Beep驱动模块
- 驱动文件
- Makefile文件
Makefile文件1、驱动的Makefile文件需要指定内核文件夹
2、编译出来的.ko驱动文件只能安装在编译时指定的内核文件的版本上
KERNEL_DIR := /home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y CURRENT_PATH := $(shell pwd) obj-m := led.o build: kernel_modules kernel_modules: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
- 第1行,指定内核源码文件目录,使用绝对路径
- 第2行,CURRENT_PATH 表示当前路径,直接通过运行“pwd”命令来获取当前所处路径
- 第3行,obj-m 表示将 led.c 这个文件编译为 led.ko 模块
- 第8行,具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作目录切
换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目录,“make modules”命令
中加入 M=dir 以后程序会自动到指定的 dir 目录中读取模块的源码并将其编译为.ko 文件。
编译
Makefile文件编写好以后输入
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
进行编译。
liefyuan@ubuntu:~/Liefyuan/cherry-pi/driver/lradc-key$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 make -C /home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y M=/home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key modules make[1]: Entering directory '/home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y' CC [M] /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.o Building modules, stage 2. MODPOST 1 modules CC /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.mod.o LD [M] /home/liefyuan/Liefyuan/cherry-pi/driver/lradc-key/mykeypad.ko make[1]: Leaving directory '/home/liefyuan/Liefyuan/cherry-pi/linux-zero-5.2.y'



