Linux内核模块编程:显示所有内核线程与进程家族信息

需积分: 0 14 下载量 101 浏览量 更新于2024-08-05 收藏 1.12MB PDF 举报
"实验二 Linux 内核模块编程1" 在这个实验中,我们将探索Linux内核模块编程的基础,学习如何编写、编译以及加载内核模块。内核模块是一种可插入和可移除的代码,允许我们扩展Linux内核的功能,而无需重新编译整个内核。以下是关于实验的具体细节: 设计要求: 实验要求开发两个内核模块。第一个模块的目标是列举系统中的所有内核线程,展示它们的程序名称(comm)、进程ID(PID)、状态、优先级(prio)以及父进程的PID。第二个模块则需接收一个进程的PID作为参数,并打印出与该进程相关的家族信息,包括父进程、兄弟进程和子进程的名称、PID和状态。输出将以树形结构和行列对齐的形式呈现。 实验步骤: 1. 编写内核模块:首先,我们需要包含必要的头文件,如`<linux/init.h>`、`<linux/module.h>`、`<linux/kernel.h>`和`<linux/sched/signal.h>`。然后,定义初始化(init)和退出(exit)函数。初始化函数`init_show_all_kernel_thread()`用于遍历所有进程并检查它们是否为内核线程(通过判断`p->mm`是否为空来确定)。对于每个内核线程,我们使用`printk`函数输出相关信息。退出函数`exit_show_all_kernel_thread()`在模块卸载时执行,但在这个简单的示例中并未执行任何操作。 2. 编写模块编译的Makefile:创建一个Makefile用于编译内核模块。通常,Makefile会包含如下内容: ``` obj-m += mymodule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ``` 这将使用内核源代码目录中的Makefile来编译我们的模块。 3. 编译并加载内核模块:运行`make`命令编译模块,然后使用`insmod`或`sudo modprobe`命令将模块加载到内核中。要卸载模块,可以使用`rmmod`命令。 在实验过程中,为了深入理解,建议阅读内核函数的源代码,如`for_each_process`循环中的遍历函数,以及与进程结构体`task_struct`相关的成员变量,如`comm`、`pid`、`state`、`prio`和`parent`。 通过这个实验,学生不仅能掌握内核模块的基本编程技巧,还能了解到Linux内核是如何管理进程的,以及如何访问和操作内核数据结构。此外,这也会提升他们对系统调用和内核API的理解。