linux内核模块编译

1.目标:

学习Linux中内核模块的编写,实现该模块的装载与卸载。
在Linux中,内核模块的保存在 /lib/modules/ 内核版本 /kernel/ 目录中。

2.编写模块源代码:

# include <linux/module.h>  	//任何模块都必须包含,定义了可动态加载到内核的模块所需要的必要信息
# include <linux/init.h>    	//必须包含,包含了宏__init(指定初始化函数)和__exit(指定清除函数)
# include <linux/kernel.h>      //里面包含常用的内核API,例如内核打印函数printk()

static int __init zyp_init(void)      //__init将函数zyp_init()标记为初始化函数,在模块被装载到内核时调用zyp_init()
{
    int sum = 0;
	int i;
    for(i = 1; i < 11; i++)		   	  //函数功能为1-10累加求和
		sum +=i;
	printk(KERN_INFO "Hello kernel\n");		//注意末尾不要忘记加换行\n,否则打印会出现某些小的错误
	printk(KERN_INFO "sum is %d\n",sum);   
                      //打印级别设为KERN_INFO,将求和结果立即打印,可以在插入模块后,在用户态下用命令dmesg查看打印效果
	return 0;
}  
static void __exit zyp_exit(void)		   //清除函数,在模块被卸载之前调用
{
	printk(KERN_INFO "Goodbye kernel\n");  //在模块卸载时,将Goodbye kernel这句话打印到日志
}	
module_init(zyp_init);   					//引导内核 模块从这里进来
module_exit(zyp_exit);   					//引导内核 模块从这里出去
MODULE_LICENSE("GPL");   					//(必选项) 模块许可证,缺省此句,将导致内核被污染
MODULE_AUTHOR("zyp");	 					//(可选项) 描述模块作者
MODULE_DESCRIPTION("ADD");  			    //(可选项) 描述模块功能 
注:

(1)__ exit标记该段代码仅用于模块卸载,被标记为 __ exit的函数只能在模块被卸载或者系统关闭时调用。如果一个模块未被定义为清除函数,则内核不允许卸载该模块。

3.准备MakeFile文件

obj-m+=zyp.o		#make会自动将源程序zyp.c编译为目标程序zyp.o            

all:
	make	-C	/lib/modules/$(shell uname -r)/build/ M=$(PWD) modules#编译模块

clean:
	make	-C	/lib/modules/$(shell uname -r)/build/ M=$(PWD) modules #清理
注:Makefile要求使用制表符进行缩进,如果使用了空格代替了制表符(TAB)来进行缩进会报错,如下:
Makefile:4: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

4.对上述文件进行编译

make

如图所示编译成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-573Wrz76-1679837922427)(D:\大三下课程笔记和PPT\系统安全\实验\实验一:Linux内核编译\assets\1679833907904.png)]

我们的目录文件多出了.ko文件,表示成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtmIaMC1-1679837922428)(D:\大三下课程笔记和PPT\系统安全\实验\实验一:Linux内核编译\assets\1679834033721.png)]

5.运行

跟普通程序直接运行不同,内核模块需要加载到内核里面发挥作用,可使用 insmod 命令加载内核模块,并使用 lsmod 命令查看已经装载的内核模块:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZFGMWxb-1679837922429)(D:\大三下课程笔记和PPT\系统安全\实验\实验一:Linux内核编译\assets\1679834703648.png)]

因为该模块装载到内核时会调用 zyp_init(void) 函数,所以我们通过 dmesg 命令查看执行结果,部分截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fDbONDBZ-1679837922429)(D:\大三下课程笔记和PPT\系统安全\实验\实验一:Linux内核编译\assets\1679834922095.png)]

6.卸载模块

通过 rmmod 命令卸载模块,并使用lsmod进行查看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5U8davS-1679837922430)(D:\大三下课程笔记和PPT\系统安全\实验\实验一:Linux内核编译\assets\1679835217393.png)]

可以看到 zyp 模块已经不存在了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨蛏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值