zoukankan      html  css  js  c++  java
  • 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内核模块的相关基本操作。还是收获颇丰的。

  • 相关阅读:
    php反射
    html video api控件总结
    linux CentOS7.2安装ffmpeg-3.0.2
    2019年7月12日星期五(C语言)
    2019年7月11日星期四(C语言)
    2019年7月10日星期三(C语言)
    2019年7月9日星期二(C语言)
    2019年7月8日星期一(C语言)
    2019年7月5日星期五(C语言)
    2019年7月4日星期四(C语言及LINUX命令)
  • 原文地址:https://www.cnblogs.com/KG35/p/5528581.html
Copyright © 2011-2022 走看看