一 题目介绍
本实验通过编写Linux内核模块,加载内核模块,并测试结果,了解Linux 内核模块的概念、编译方法、安装和测试方法。
任务描述:
- Linux 内核模块的基本概念
- Linux 内核模块的编写方法
- Linux 内核模块的加载和移除
- Linux 内核模块的测试方法
实验目的:
- 学习掌握 Linux 内核模块的编写
- 学习掌握 Linux 内核模块的加载和移除
- 学习掌握测试 Linux 内核模块
二 实验思路
图1:使用Linux内核模块流程图
三 遇到问题及解决方法
- 对于task_struct结构体的一知半解,不明白父子进程、兄弟进程的关系,最后通过学习知道了拥有同一个父进程的所有进程被称为兄弟,每个 task_struct都包含一个指向其父进程 task_struct的指针 parent,还有一个被称为 children 的子进程链表的关系。
- task_struct结构体中state的含义:
- 对list_for_each和list_entry两个宏的学习,list_for_each相当于一个for循环去遍历链表,list_entry负责获取链表表头。
- 为什么list_entry的第3个参数要用sibling,children.next指向的是sibling成员,因此在使用list_entry()获得task_struct指针时,参数要用sibling而不是children。
四 核心代码及实验结果展示
图1:编写模块代码
图2:编写对应模块的Makefile文件
图3:编译文件夹内的文件并加载编译出来的.ko模块文件
图4:使用lsmod命令 看到我们的模块已经加载上了
图5:模块在日志中打印了系统名和版本号,与uname命令得到的内容相同
图6:编写模块代码
图7:编写对应模块的Makefile文件
图8:编译加载模块后使用dmesg查看日志
图9:如果输入一个不存在的pid,则无法正常输出