linux内核配置模块编译安装
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核配置编译和加载
Linux内核模块
Linux内核结构非常庞大,包含的组件也非常多,想要把我们需要的部分添加到内核中,有两个方法:直接编译进内核和模块机制
由于直接编译进内核有两个缺点,一是生成的内核过大,二是每次修改内核中功能,就必须重新编译内核,浪费时间。因此我们一般采用模块机制,模块本身不被编译进内核映像,只有在加载之后才会成为内核的一部分,方便了修改调试,节省了编译时间。
配置内核
(1)在drivers目录下创建hello目录存放hello.c源文件
(2)在hello目录下新建Makefile文件和Kconfig文件
Makefile文件内容:
obj-y += hello.o //要将hello.c编译得到的hello.o连接进内核
Kconfig文件内容:
允许编译成模块,因此使用了tristate
(3)在hello目录的上级目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项
修改即driver目录下的Kconfig文件,添加
source "drivers/hello/Kconfig" //使hello目录下的Kconfig起作用
(4)在hello目录的上级目录的Makefile文件中增加对新源代码的编译条目
修改driver目录下的Makefile文件,添加
obj-$(CONFIG_HELLO_FOR_TEST) += hello/ //使能够被编译命令作用到
(5)命令行输入“make menuconfig”,找到driver device,选择select,发现test menu
已经在配置菜单界面显示出来
(6)选择test menu进入具体的配置,可以选择Y/N/M,这里我选择编译为M,即模块化
(7)保存退出后出现
(8)进入kernels目录中使用“ls -a”查看隐藏文件,发现多出.config隐藏文件,查看.config
文件
模块方式动态编译进内核
一:模块编译
(1)编写Makefile文件,对已有的Makefile文件进行修改
KVERS = /usr/src/kernels/2.6.18-8.el5-xen-i686
# Kernel modules
obj-m += hello.o //指定要添加的模块
# Specify flags for the module compilation. //优化选项,调试阶段先注销
#EXTRA_CFLAGS=-g -O0
build: kernel_modules
kernel_modules:
make -C $(KVERS) M=$(CURDIR) modules //使用-C目录下的Makefile对M=后变的目录中的模块(即当前目录中的模块)进行编译
clean:
make -C $(KVERS) M=$(CURDIR) clean
(2) 在当前目录下执行“make”命令,发现多出.ko文件,这就是形成的模块
二:模块加载
(1) 在终端输入:“insmod hello.o”进行加载,再用“lsmod”查看当前系统中使用的模块
(2) 在终端输入:dmesg | tail -4 这是查看内核输出信息的意思。tail -12 显示最后12条
三:模块卸载
日志文件中输出printk的内容!
加载成功
Hello模块已不在当前系统中