Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3513904
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类:

2012-11-29 12:54:56

目的是要:

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
#include
#include
#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是我们定义的系统调用号,当然,我们也可以在文件中(通过追踪syscall.h文件,在usr/include/目录下)添加相同的内容来实现。

 

重新编译内核,调用我们上面完成的用户空间程序。之查看/var/log/messages文件,我们看到:

Nov 15 21:23:51 hanpfei kernel: Hello, World.

这说明我们搭的框架是成功的。

阅读(1073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~