为x86架构Linux添加系统调用
时间:2010-11-18 来源:tq08g2z
目的是要:
1、为kernel增加一个系统功能调用,把kernel当前被缓冲的所有dentry及其父子关系都返回给调用者;
比较容易做实验的环境还是我们的PC机,所以,也就选择了往x86架构的Linux中添加一个系统调用了。
添加一个系统调用大致需要以下步骤:
1、编写系统调用例程。考虑到我们要实现的系统调用要返回被缓冲的dentry极其父子结构,我们要使用fs/dcache.c文件里正是各种各样与dentry有关的函数。所以,我们的系统调用就直接添加在fs/dcache.c文件的末尾处了。最初我们打算仅仅实现一个框架:
/* Added by hanpfei, 2011.11.18 */
SYSCALL_DEFINE0(dentry_info)
{
printk(KERN_ALERT”Hello, World.\n”);
return 0;
}
2、在系统调用表中添加我们实现的系统调用例程的函数指针:
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
.long sys_recvmmsg
.lonh sys_dentry_info
3、在文件include/linux/syscalls.h中添加系统调用例程的原型:
asmlinkage long sys_dentry_info(void);
4、我们自己添加的这个系统调用,如果要用的话,还没有封装例程可供使用,所以需要使用syscall()例程来调用:
#include <syscall.h>
#include <stdio.h>
#include <linux/unistd.h>
#define __NR_silly_copy 338
int main()
{ printf("Before call silly_copy\n");
syscall(__NR_silly_copy);
printf("After call silly_copy\n");
return 0;
}
上面的#define __NR_silly_copy 338是我们定义的系统调用号,当然,我们也可以在文件中<asm/unistd.h>(通过追踪syscall.h文件,在usr/include/目录下)添加相同的内容来实现。
重新编译内核,调用我们上面完成的用户空间程序。之查看/var/log/messages文件,我们看到:
Nov 15 21:23:51 hanpfei kernel: Hello, World.
这说明我们搭的框架是成功的。