linux内核-平添系统调用
linux内核--添加系统调用1、目的:在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现
linux内核--添加系统调用
1、目的:
在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历系统中的所有进程。实验主要内容:
添加系统调用的名字利用标准 C 库进行包装添加系统调用号在系统调用表中添加相应表项sys_mysyscall 的实现编写用户态测试程序
2、步骤:a)安装依赖库:
d)修改内核的系统调用库函数:Ubuntu12.04(可不用修改):
添加系统调用号之后,系统才能根据这个号,作为索引,去找 syscall_table 中的相应表项。
所以,接下来的一步就是:
e)在系统调用表中添加或修改相应表项在上面步骤中解压出来的内核源代码包中进行修改相关函数:进入下列目录:
到现在为止,系统已经能够正确地找到并且调用 sys_mysyscall。剩下的就只有一件事情,那
就是 sys_rksyscall 的实现。
f)sys_rksyscall的实现:我们把这一小段程序添加在 kernel/sys.c 里面。在这里,我们没有在 kernel 目录下另外
添加自己的一个文件,这样做的目的是为了简单,而且不用修改 Makefile,省去不必要的麻
烦。
rksyscall 系统调用实现遍历系统中所有进程,并打印每个进程的进程名字(name)、进
程标识符(pid) 、进程的状态和父进程的名字。
g)重新编译内核:
接下来一步是以防万一:
rksyscall 系统调用中 printk 函数输出的信息在/var/log/messages 文件中。在用户态测试程序从/var/log/message 文件中读出每个进程的进程名字、进程标识符、进程的状态
( 如 : 运 行 、 可 中 断 等 待 ......) 并 分 析 和 父 进 程 的 名 字 , 在 屏 幕 中 输 出 这 些 信 息 。
/var/log/message 文件中的内容也可以在 shell 下用 dmesg 命令查看到。
在 Linux 2.6.25以 后 内 核 中 , 宏 _syscall0() 至 _syscall6() 不再定义在/usr/include/asm/unistd.h中,因此需要使用syscall()函数实现系统调用。
用户态测试程序可以用如下方法实现