Linux及安全实践二

Linux及安全实践二

 

基本内核模块

20135238 龚睿

1、  理解模块原理

linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。之所以提供模块机制,是因为Linux本身是一个单内核。单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷。

Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。

一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表中,以便模块间的通信。

2、编写模块代码

模块构造函数:执行insmod或modprobe指令加载内核模块时会调用的初始化函数。函数原型必须是module_init(),括号内是函数指针

模块析构函数:执行rmmod指令卸载模块时调用的函数。函数原型是module_exit()

模块许可声明:函数原型是MODULE_LICENSE(),告诉内核该程序使用的许可证,不然在加载时它会提示该模块污染内核。一般会写GPL。

 头文件module.h,必须包含此文件;

头文件kernel.h,包含常用的内核函数;

头文件init.h包含宏_init和_exit,允许释放内核占用的内存。

 写一个简单的代码,用来向内核输出一段文字。

3、编译模块

接下来写Makefile。

这里需要注意的一点就是内核的版本,每个人的虚拟机内核版本可能都不甚相同,需要做的就是查看清除内核版本(查看指令为 uname -r)、核对正确内核路径,在进行makefile的编写。

在makefile编写完成并确定无误后,进行make动作:

成功之后呢会生成不少文件在你.c文件的目录中。

然后进行模块的装载、测试并查看模块、卸载模块等简单的基本操作。

加载模块:insmod

卸载模块:rmmod

dmesg查看测试模块:(注意这里d必需要小写

4、实现输出当前进程信息

代码码好以后重复第一步的每一个步骤,最后查看输出测试状态如下:

5、读取进程链表的功能

在modgr2.c基础上修改得到,用于输出内核测试的状态和读取进程链表。

可以看到,我用了一个叫做for_each_process()的宏,它的定义如下:

其实就是个for循环,从第一个PCB(叫做init_task)开始,顺着next指针读了一圈。

之后就是重复和第一步中相同的操作。

 

修改已经存在的Makefile,用于第三次的编译。

进行编译:

这边装载的时候会出现一个简单却不容易发现的问题:在自己做的过程中已经加载过一遍的内核,在老师验收的时候重复加载模块的操作时会出现错误,错误提示非常明显:file existed,需要现行卸载,才能再次成功地执行加载模块的操作

在发现问题以后就如下正常操作即可:

最后看一下测试结果:

这次的实践因为代码是直接参考学姐的照敲的,所以整个过程都比较简单,偷懒的人毕竟还是诚实的,但是也很好的了解到了Linux内核模块的相关基本操作。还是收获颇丰的。

原文地址:https://www.cnblogs.com/KG35/p/5528581.html