第五章-内核模块
OpenEuler树莓派内核编译安装
1.系统备份
cd ~ dnf install lrzsz # rz和sz可以在终端下很方便的传输文件 tar czvf boot_origin.tgz /boot/ sz boot_origin.tgz # 将备份文件发送到本地
2.内核源码下载
在gitee仓库中下载OpenEuler内核压缩文件并解压
内核地址:https://link.csdn.net/?target=https%3A%2F%2Fgitee.com%2Fopeneuler%2Fkernel%2Freleases
下载好之后进行解压
移动到内核源码目录:
3.清理源代码树
make mrproper
4.生成内核配置文件
复制原配置文件并依赖安装、更改配置:
yum install ncurses-devel make menuconfig
选择save,生成配置文件.config
安装编译所需组件:
yum install elfutils-libelf-devel yum install openssl-devel yum install bc
5.编译、安装
make -j4 #四核多线程编译,提升编译效率,cpu发热也提升。
安装模块、内核:
make module_install make install
更新引导后重启,可以看到编译成功的新内核,选择新内核回车即可:
查看内核版本:
内核安装成功。
6.内核模块编程
helloworld.c: #include<linux/module.h> MODULE_LICENSE("GPL"); int __init hello_init(void) { printk("hello init\n"); //printk函数,而不是之前学的printf printk("hello,world!\n"); return 0; } void __exit hello_exit(void) { printk("hello exit\n"); } module_init(hello_init); module_exit(hello_exit); Makefile: ifneq ($(KERNELRELEASE),) obj-m := helloworld.o else KERNELDIR ?=/usr/src/kernels/5.10.0-4.25.0 #此处实验文档所给为树莓派内核目录,在此要修改为x86_64系统下的内核目录,并且在后续的内核编程中所有的Makefile文件都需要更改为该路径。 PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif .PHONY:clean clean: -rm *.mod.c *.o *.order *.symvers *.ko
先学习内核模块和Makefile文件的基本结构:
//内核模块.c文件基本框架 #include<linux/module.h> //包含了对模块的结构定义以及模块的版本控制 MODULE_LICENSE("GPL"); //声明GPL版权 static __init module_init(void){ //加载模块 。。。。。。 } static __exit module_exit(void){ //卸载模块 。。。。。。 } module_init(module_init); module_exit(module_exit); //Makefile文件基本框架 ifneq ($(KERNELRELEASE),) obj-m :=main.o //指定将要编译的内核模块列表(一些.o文件) else KERNELDIR ?=/usr/lib/modules/$(shell uname -r)/build //内核源代码位置 PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules //编译连接目标 endif .PHONY:clean clean: -rm *.mod.c *.o *.order *.symvers *.ko
模块的加载、查看、卸载:
内核模块的相关操作:
1.加载内核模块:insmod
2.卸载内核模块:rmmod
3.查看内核模块:lsmod
4.查看打印信息:dmesg | tail -n 行数
7.实验总结
通过这个实验,我完整地进行了从编写内核源码、make编译、加载、卸载、查看内核模块的整个过程,也是为后续相关实验的顺利进行奠定了基础。