本文目录
- 前述:内核框架图
- 一、Linux 内核模块概述
- 二、Linux 模块的优点
- 三、知识点
- 1. GPL开源协议
- 2. 查看已安装的模块文件:lsmod
- 四、常用API
- 1. 入口函数
- 2. 出口函数
- 3. 声明驱动模型出/入口函数
- 4. printk内核输出函数
- 五、内核源码头文件
- 六、编写内核模块文件
- 七、注意
前述:内核框架图
一、Linux 内核模块概述
嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性,用户只需要拿到相关驱动模块,再安装到用户的内核中,即可灵活地使用你的设备。
二、Linux 模块的优点
- 用户可以随时扩展 Linux 系统的功能。
- 当设备驱动有更新时,只需要卸载旧模块,重新安装即可。
- 系统需要增加新的模块功能,不必重新编译内核,只要安装相应模块文件即可。
- 使用模块,还可以减小 Linux 内核的体积,节省 flash。
- 可以在不影响核心系统的情况下开发和测试新功能,降低系统崩溃或不稳定的风险。
三、知识点
1. GPL开源协议
我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。
GPL具有“传染性”,只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用 GPL协议,既必须也是开源和免费。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。
GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。
2. 查看已安装的模块文件:lsmod
四、常用API
1. 入口函数
static int __init 函数名(void)
{
return 0;
}
2. 出口函数
static void __exit 函数名(void)
{
}
3. 声明驱动模型出/入口函数
module_init(入口函数名);
module_exit(出口函数名);
4. printk内核输出函数
printf
函数用于应用层,printk
函数用于内核层。
printk函数是Linux内核中用于输出消息的函数。它类似于C语言中的printf函数,但是用于内核空间的打印,因此它有一些特定的用法和限制。printk不能使用浮点功能,不能有 %f,%lf,其余功能和printf一样。
五、内核源码头文件
在编写内核时,必须要用到开发板的内核源码文件中的最底层Makefile文件。这里我使用香橙派5Plus开发,具体使用详情查看官方开发手册即可。里面有详细的步骤操作。
通常我们在开发板中安装的镜像包会有包含内核的头文件的.deb包 (路径查看开发板手册获得) ,我们只需要安装这个.deb包即可。安装完成后,会有一个文件夹。这个文件夹里就包含了我们所需要的最底层的Makefile文件。如果没有这个.deb包,则需要我们手动下载源码文件,然后编译生成.deb文件,然后在开发板上安装。
六、编写内核模块文件
Linux内核模块编写1(一个c文件生成一个ko文件)
Linux内核模块编写2(多个c文件生成一个ko文件)
Linux内核模块编写3(多个c文件生成多个ko文件)
七、注意
Makefile
hello.c