linux内核模块的编译方法有两种:
1.放入linux内核源码中编译。
2.独立编译模块。
(1)放入linux内核源码中编译
这里先了解Kconfig和Makefile的作用
Kconfig:对应内核模块的配置菜单。
Makefile:对应内核模块的编译选项。
linux内核编译过程:是根据配置裁剪的结果配合Makefile完成内核编译。
以ARM平台为例,具体配置过程:
1.当执行make menuconfig 时,系统首先读取arch/arm/Kconfig生成整个配置界面
2.在读取配置界面的同时,系统会读取顶层目录下的.config文件,生成所有配置选项的默认值
3.当修改玩配置并保存后,系统会更新顶层目录下的.config
4.当执行make时,各层的Makefile会根据.config文件中的编译选项来决定哪些文件会被编译到内核中,或者编译成模块。
下面进入正题怎么把自己的内核代码添加到内核中,
1.把自己的内核代码放入到内核合适的位置 // 字符驱动 driver/char/
2.把自己开发的功能添加到linux内核的配置选项中,使用户能够选中这项功能并编译。// vi /driver/char/Kconfig
在Kconfig文件结尾,endmenu的前面加入一个config选项
config 2018_HELLO
bool "This is my first drive "
default y
help
The driver hh.
3.构建或修改Makefile。// vi dreiver/char/Makefile obj-$(CONFIG_2018_HELLO) += hello.c
4.执行make
(2)独立编译
KVERS = $(shell uname -r)
obj-m += hello.o
build: kernel_modules
EXTRA_CFLAGS=-g -o0
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
写个Makefile就好了,生成.ko 在insmod hello.ko。
两者的区别就是独立编译比较省时间,方便添加 移除,重启后消失。