加载内核模块,实现新的系统调用:遍历系统当前所有进程的任务描述符,并将pid组织成树状结构显示


一、题目要求


在Linux内核中增加一个系统调用,并编写对应的linux应用程序。利用该系统调用能够遍历系统当前所有进程的任务描述符,并按进程父子关系将这些描述符所对应的进程id(PID)组织成树形结构显示。

二、分析


系统调用是内核为用户进程提供服务的一种方式。通过系统调用,内核能够提供给用户模式下的进程和硬件设备的接口,保护对内核所管理的资源的访问,提高系统安全,提高程序的可移植性。系统调用的概念如图1所示。

图1 系统调用的概念

题目中要求增加一项新的系统调用,可以实现对当前系统进程的遍历访问。其本质就是在内核中实现一个新的函数,调用该函数可以得到进程遍历的结果。增加系统调用的方式有两种:

其一,修改内核源码。我们在内核源码中,找到对应文件,增加新的系统调用编号,系统调用跳转表项和相应的例程。然后重新编译内核。利用编译好的内核重启系统,则该系统就支持我们新加的这项系统调用。

其二,加载内核模块。内核模块是一种没有经过链接,不能独立运行的目标文件,运行在内核空间中。经过链接装载到内核里面,成为内核的一部分,可以访问内核的公用符号,其概念如图2所示。我们可以设计一个内核模块,在其中实现程序逻辑,然后将其加载到内核中,这样也可实现在内核中增加新的系统调用。


图2 内核模块概念

显而易见的是,第二种方法符合模块化设计思想,根据需要动态使能/禁止模块,可以保证计算机资源。避免了第一种方法重新编译内核的麻烦,而且避免了使内核臃肿。我们下面程序实现通过加载内核模块的方式。

三、程序设计思路


根据分析,我们采用加载内核模块的方式来实现题目要求。那么程序设计思路就很清晰了,其主要步骤包括:

1、内核模块的代码框架

内核模块代码有自己的程序框架,包括需要的若干头文件,模块入口函数和模块退出函数,GPL许可下引入识别代码宏。

2、逻辑代码

根据题目要求,我们需要对当前系统中的进程进行遍历,并且按照父子关系进行树状结构输出结果。这一部分属于逻辑代码,我们可以实现一个函数processtree(),然后加入到内核模块代码中。通过修改原系统调用地址,来执行我们自定义的函数,从而实现该功能。

3、用户测试程序

编译好内核模块后,加载到系统中。我们需要知道该项系统调用是否成功。编写测试程序,调用该系统调用,打印返回结果查看。涉及问题是内核态数据和用户态数据的交换


四、程序设计

1、内

  • 14
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值