第一节:如何在linux内核添加自定义代码
简介
该节主要完成功能:在内核中添加一段自定义示例代码,并运行。
具体流程
1. 创建自定义文件
在linux源码目录下的dirvers/misc/下创建一个dummy.c文件,文件内容如下
/*
* Dummy code
*/
#include <linux/module.h>
static int __init dummy_code_init(void)
{
printk(KERN_INFO "dummy-code loaded\n");
return 0;
}
static void __exit dummy_code_exit(void)
{
printk(KERN_INFO "dummy-code unloaded\n");
}
module_init(dummy_code_init);
module_exit(dummy_code_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("TestLinux");
MODULE_DESCRIPTION("Dummy code");
文件内容说明:
module_init
和module_exit
是linux内核定义的宏,调用这两个宏后,内核将在其启动过程中,自动运行dummy_code_init
函数,在其关机时,自动运行dummy_code_exit
函数。
dummy_code_init
和dummy_code_exit
函数内部只实现了从debug串口打印信息的功能。
2. 修改内核配置
文件创建完成后,还需要将文件添加进内核的配置和编译系统中,否则,文件将毫无作用。需要做如下几步操作–
修改Kconfig文件
修改drivers/misc/Kconfig
文件,在文件最后添加如下代码
+config DUMMY_CODE
+ tristate "Dummy code"
+ default n
+ ---help---
+ This module is just for demonstration purposes.
Endmenu
注意!每行前面的+号代表该行为新增代码,真实使用时无此+号,文章以后所有的+号均为此意。
修改Makefile文件
修改drivers/misc/Makefile
文件,在文件中新增如下代码
+obj-$(CONFIG_DUMMY_CODE) += dummy-code.o
该行代码功能:当CONFIG_DUMMY_CODE被使能时,即CONFIG_DUMMY_CODE=y时,dummy-code.c会被编译并被链接进内核二进制镜像中。
运行menuconfig
打开ubuntu的terminal软件,使用cd
指令进入到内核源码根目录,输入指令make menuconfig
,将弹出一个菜单选择界面,按照Device Drivers->Misc devices->的顺序,可找到Dummy code选项,如下图所示
按Y键选中Dummy code,注意不要按M选中。
按Y选中Dummy code,则CONFIG_DUMMY_CODE会被使能,即CONFIG_DUMMY_CODE=y。修改完成后,保存并退出。
3.重新编译内核并烧录
make menuconfig
保存完成后,使用make Image
指令重新编译整个内核,并将生成的镜像烧入开发板。
重启开发板,会看到如下打印
...
loop: module loaded
dummy-code loaded
ahci-mvebu d00e0000.sata: AHCI 0001.0300 32 slots 1 ports 6 Gbps
...
由以上打印可看出,自定义代码已添加进内核,并在系统启动时自动运行。
具体内核配置和编译系统的工作机制,可参考内核文档,在内核源码根目录下的
Documentation\kbuild文件夹下的内容。