《Linux及安全》实践2

一、Linux基本内核模块

1.1什么是内核模块

  • linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。之所以提供模块机制,是因为Linux本身是一个单内核。单内核由于所有内容都集成在一起,效率很高,但可扩展性和可维护性相对较差,模块机制可弥补这一缺陷。
  • Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。(我们要做的实践内容就是动态加载内核模块)
  • 一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表中,以便进行模块间的通信。

1.2.c程序编写

  • 具体代码如下(打印学号):

  • 解释:

    (1)关于 #include <linux/init.h>以及#include <linux/module.h>是编写内核模块程序所必须的2个头文件。

    (2)编写内核模块时必须要有的两个函数 :

    - 加载函数:

      		static int init_fun(void)
    {
    // 初始化代码
    }
    函数实例:
    static int hello_init(void)// 不加void在调试时会出现报警
    {
    printk("hello world!/n");
    return 0;
    }
    - 卸载函数(出口函数) 无返回值 static void cleaup_fun(void)
    {
    // 释放代码
    }

    (3)printk是内核态信息打印函数,功能和比标准C库的printf类似

    (5)module_init(fun):告诉内核模块程序从何处开始执行。module_exit(fun):告诉内核编写模块程序从何处离开。

    (6)模块许可声明:函数原型是MODULE_LICENSE(),告诉内核该程序使用的许可证,一般是GPL。

1.3Makefile编写

  1. 代码如下:

  2. 解释:

    • 其中make -C $(LINUX_KERNEL_PATH) 指明跳转到内核源码目录下读取Makefile

      M=$(CURRENT_PATH) 表明返回到当前目录继续执行当前的Makefile(M= 后指定的是 lwr.c 和 Makefile 所在的目录)
    • 关于个人虚拟机的内核版本号,输入指令“uname - a”可查看,在usr/src中可找到

1.4操作

  • 输入make进行自动编译;编译之后,生成需要的文件

  • 输入sudo insmod lwr.ko,加载模块(root权限)

  • 输入dmesg,测试模块输出

  • 卸载模块:“sudo rmmod 模块名” 之后,就将内核中之前加载的模块删除,此时再输入dmesg测试,可以看到显示了exit信息

二、Linux内核模块的功能实现

1.实现输出当前进程信息的功能

  • 代码如下:

  • 结果如下:

  • 温馨提示需要改一下makefile哦,代码里使用了printk函数打印了进程的pid、state等信息

2.实现读取进程链表的功能

  • 代码如下:

  • 结果如下:

  • 这个与上述不同的地方在于要打印进程链表的,所以需要一个循环,连续打印

  • for_each_process()的函数本质即for循环,从第一个PCB(init_task)开始,顺着pcurrent链表进行遍历,输出所有当前进程的信息(pid,tgid等)。

《Linux内核分析》实践2的更多相关文章

  1. paip.java win程序迁移linux的最佳实践

    paip.java win程序迁移linux的最佳实践 1.class load路径的问题... windows哈第一的从calsses目录加载,,而linux优先从jar加载.. 特别的是修理了ja ...

  2. 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置

    本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...

  3. Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载五)Linux系统的对话方式

    本篇是Linux小白最佳实践第5篇,目的就是让白菜们了解Linux进程之间是如何对话的.之前连载的几篇,在微信上引起了很多的反响,有人也反映图多文字少,感觉没有干货.本篇选了大部分是实战讲解的&quo ...

  4. Linux及安全实践五——字符集编码

    Linux及安全实践五——字符集编码 一.ASCII码 在表中查找出英文字母LXQ相对应的十六进制数值为: 4c 58 51 在终端中输入命令:vim test1.txt 在vim页面输入命令:%!x ...

  5. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...

  6. Linux及安全实践三——程序破解

    Linux及安全实践三--程序破解 一.基本知识 常用指令机器码 指令 作用 机器码 nop 无作用(no operation) 90 call 调用子程序,子程序以ret结尾 e8 ret 返回程序 ...

  7. Linux及安全实践二——模块

    Linux及安全实践二--模块 一.模块的编译.生成.测试.删除 1.编写模块代码 编写:gedit 3.c 2.编写Makefile obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj ...

  8. Linux及安全实践二

    Linux及安全实践二   基本内核模块 20135238 龚睿 1.  理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...

  9. 20135323符运锦----LINUX第二次实践:内核模块编译

    Linux实践二--模块 一.知识点总结 ①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率 ...

  10. linux内核分析实践二学习笔记

    Linux实践二--内核模块的编译 标签(空格分隔): 20135328陈都 理解内核的作用 Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...

随机推荐

  1. Hive-1.2.1_04_DML操作

    Hive官方文档:Home-UserDocumentation Hive DML官方文档:LanguageManual DML 参考文章:Hive 用户指南 1. Loading files into ...

  2. 使用requests模块保存网络上的图片

    import requests url = 'https://www.baidu.com/img/bd_logo1.png' r = requests.get(url=url) with open(' ...

  3. 方程:方程(equation)是指含有未知数的等式

    方程(equation)是指含有未知数的等式.是表示两个数学式(如两个数.函数.量.运算)之间相等关系的一种等式,使等式成立的未知数的值称为“解”或“根”.求方程的解的过程称为“解方程”. 方程中文一 ...

  4. [BJWC2011]元素

    嘟嘟嘟 题中说选的数的编号亦或和不能为0,也就是在这个集合中,不能用不同的选取方案亦或出相同的值.由此联想到线性基的一个性质是,每一个数都能由线性基中特定的一些数亦或得到. 所以我们就是要求出这些数的 ...

  5. Linux操作系统中打开文件数量的查看方法

    Linux操作系统中打开文件数量的查看方法ulimit -n 4096也就是限制用户的最大文件打开数为4096个 在网上查了关于怎么查看文件打开数的文章大致有两种说法/proc/sys/fs/file ...

  6. PHP的运行机制与原理(底层)

    原文:http://www.jb51.net/article/74907.htm 说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来 ...

  7. jquery clone

    clone([Even[,deepEven]]) 概述 克隆匹配的DOM元素并且选中这些克隆的副本. 在想把DOM文档中元素的副本添加到其他位置时这个函数非常有用. 参数 EventsBooleanV ...

  8. 2emq服务器压力测试(无用)

    https://blog.csdn.net/frankcheng5143/article/details/52117057 1登阿里云,进入服务控制界面 https://account.aliyun. ...

  9. metamask源码学习-controller-transaction

    ()metamask-extension/app/scripts/controllers/transactions Transaction Controller is an aggregate of ...

  10. 使用Mongoose类库实现简单的增删改查

    使用Mongoose类库实现简单的增删改查 Mongoose是在nodejs环境中对MongoDB数据库操作的封装,一种对象模型工具,可以将数据库中的数据转换为javascript对象供我们使用. M ...