- 214
- 0
- 约1.14千字
- 约 6页
- 2017-06-20 发布于福建
- 举报
通过内核模式显示进程控制块信息
实验名称
通过内核模式显示进程控制块信息
实验内容
在内核中,所有的进程控制块都被一个双向链表连接起来,该链表中的第一个进程控制块为init_task。编写一个内核模块,模块接收用户传递的一个参数num, num指定要打印的进程控制块的数量;若用户不指定num或者num0,模块则打印所有进程控制块的信息,需要打印的进程控制块信息由:进程PID和进程的可执行文件名
实现方法分析
在内核中,进程控制块被组织成多个双向链表,其中一个双向链表包含所有进程控制块,只需要访问该双向链表,就可以访问到所有的进程控制块。
在进程控制块task_struct中,包含一个名为tasks的成员,该成员的类型为list_head,这就意味着进程控制块能够通过该成员将进程控制块串成一个双向链表。
内核定义宏for_each_proces用于遍历所有的进程控制块。
for(p=init_task;(p = list_entry((p)-task.next,struct task_struct,tasks)) != init_task)
在进程控制块的数据结构中,成员pid为进程的PID,而成员comm包含进程可执行文件名。使用dmesg命令可以查看系统日志。
实现方法分析
#include linux/init.h
#include linux/module.h
#include linux/proc_fs.h
#include asm/uaccess.h
MODULE_LICENSE(“GPL”)
static int num = -1;
module_param(num, int, S_IRUGO);
static int exp_init(void)
{
struct task_struct * p = NULL ;
for_each_process(p){
/*向日志写入num个进程PID和可执行文件名*/
}
}
static void exp_exit(){/*清理函数*/}
module_init(exp_init);
module_exit(exp_init);
实验结果展示
实验涉及主要函数描述
pintk(KERN_ALERT”hello,world!\n”) 向系统日志中写入”hello,world”
module_init() 去注册初始化函数
module_exit()去注册清理函数
原创力文档

文档评论(0)