Linux及安全实践二
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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内核模块的相关基本操作。还是收获颇丰的。
以上是关于Linux及安全实践二的主要内容,如果未能解决你的问题,请参考以下文章