静态加载法
⼀、向内核添加新功能
静态加载法
- Kconfig相当于make menuconfig中的界面配置文件
- <M>modules 会被编译成独立的内核模块文件(.ko文件)
- Kconfig决定menuconfig界面内的内容 tristate决定对应的菜单项有几种选择
- config 后的菜单项关联到Makefile ,makefile后的.o文件对应新功能的源码文件
- 在menuconfig 内做好相应的选择后,将会在顶层目录生成一个.config文件,后面make uImage会依据.config文件的内容决定哪些会参与编译到uImage
- Kconfig 相当于make menuconfig 界面配置文件
1.1 静态加载法:
即新功能源码与内核其它代码一起编译进uImage文件内
1. 新功能源码与Linux内核源码在同一目录结构下
在linux-3.14/driver/char/目录下编写myhello.c,文件内容如下:
#include <linux/module.h>
#include <linux/kernel.h>int __init myhello_init(void)
{printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("myhello is running\n"); printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");return 0;
}void __exit myhello_exit(void)
{printk("myhello will exit\n");
}
MODULE_LICENSE("GPL");
module_init(myhello_init);
module_exit(myhello_exit);2. 给新功能代码配置Kconfig
#进入myhello.c的同级目录
cd ~/fs4412/linux-3.14/drivers/char
vim Kconfig
#39行处添加如下内容:
config MY_HELLO
tristate "This is a hello test"
help
This is a test for kernel new function
3. 给新功能代码改写Makefile
#进入myhello.c的同级目录
cd ~/fs4412/linux-3.14/drivers/char
vim Makefile
#拷贝18行,粘贴在下一行,修改成:
obj-$(CONFIG_MY_HELLO) += myhello.o
4. make menuconfig 界面里将新功能对应的那项选择成<*>
cd ~/fs4412/linux-3.14
make menuconfig
#make menuconfig如果出错,一般是两个原因:
#1. libncurses5-dev没安装
#2. 命令行界面太小(太矮或太窄或字体太大了)
menuconfig01
menuconfig02
menuconfig03
menuconfig04
