第五章-内核模块

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编译、加载、卸载、查看内核模块的整个过程,也是为后续相关实验的顺利进行奠定了基础。

posted @ 2022-02-28 16:36  张灯结彩,潇潇暮雨  阅读(80)  评论(1编辑  收藏  举报