1.本文仅仅是西电软件工程OS实验课的教程,原则上只接受关于本实验相关的问题
2.代码原则上仅仅作为参考,如果被查出因为抄袭而导致不良的后果,本人不负任何责任。
3.文章中的代码是经过整合而得到的,如有侵权,请及时联系
4.关于实验系统 本人使用的是Ubuntu 20.04 linux内核最低5.4.x vmware 15.x
5.接上条,如果你按照了这个配置还是出现了问题,那么可以at我
===============================================================
$ 0.99
本文参考自 https://blog.youkuaiyun.com/qq_36290650/article/details/85648835 侵权必删
在前面的章节中,花费最多时间是在编译上,或许你一遍就编译通过,或许你今天也还没得到正确的结果,不过这都不重要,因为专题三理论上来讲和前面没啥关系…
专题三是模块部分,你可以理解为操作系统在编译完成后留了一些钩子函数,这些钩子可以动态加载你写的程序(而不需要重新编译(好吧其实我是乱说的))
于是我又给你们当工具人了
$1.0 题目一:内核模块加载/卸载
$1.1写内核
随便一个目录下(我这里是放到桌面了)
mkdir simplemodule # 创建目录
cd simplemodule/ # 进入目录
sudo gedit simple.c # 开始写内核
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
//模块加载时运行此函数
int simple_init(void) //模块入口点没有传入参数(void)
{
printk(KERN_INFO "xxxxxxx Now Loading Module\n");
return 0; //模块入口点必须返回int,0:成功 !0:失败
}
//模块删除时运行此函数
void simple_exit(void)
{
printk(KERN_INFO "xxxxxxx Removing Module\n");
}
module_init(simple_init); //模块入口点
module_exit(simple_exit); //模块离开点
MODULE_LICENSE("GPL"); //模块证书
MODULE_DESCRIPTION("Simple Module"); //模块描述
MODULE_AUTHOR("tiantian"); //模块作者
module_init(simple_init) 和 module_exit(simple_exit) 代表着装载和卸载这个模块要执行的函数
之后
sudo gedit Makefile
obj-m:=simple.o
PWD:= $(shell pwd)
KERNELDIR:= /lib/modules/$(shell uname -r)/build
EXTRA_CFLAGS= -O0
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
Makefile里面写这些 ↑
然后进行模块编译
sudo make
没报错基本上就成功了
1.2 装载&卸载模块
sudo insmod simple.ko
dmesg
你的屏幕上会打印装载的信息
你也可以看看是否装载成功了没有
sudo lsmod
这就是我们装入的模块
然后卸载
sudo rmmod simple.ko
dmesg
理论上只会出现一条Removing 但是因为我们没有清 所以会打印之前的
你只要执行 sudo dmesg -C 就可以了
啥时候截图我就8用说了吧…