Chinaunix首页 | 论坛 | 博客
  • 博客访问: 801734
  • 博文数量: 117
  • 博客积分: 2583
  • 博客等级: 少校
  • 技术积分: 1953
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 22:58
个人简介

Coder

文章分类
文章存档

2013年(1)

2012年(10)

2011年(12)

2010年(77)

2009年(13)

2008年(4)

分类: LINUX

2010-11-18 17:07:45

目的是要:

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.

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

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

chinaunix网友2010-11-19 15:23:02

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com