Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346140
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类: LINUX

2008-04-24 20:57:16

OS大作业,大做也。

使用ubuntu linux 7.10,内核代码版本是2.6.22.19,源里直接下的。
目的:为内核添加一个系统调用,然后使用之。

添加系统调用需要牵扯到3个文件

1.系统调用的实现,在kernel/sys.c,在文件下面补上这段代码就可了,

asmlinkage long sys_pedagogictime(struct timeval *tv)
{
        if(!tv)
                return;
        struct timeval ktv;
        do_gettimeofday(&ktv);
        if(copy_to_user(tv,&ktv,sizeof(ktv)))
                return -EFAULT;
        return 0;
}

这个调用是返回当前时间.

2.在初始化syscall的代码中注册这个系统调用,网上的资料都说在entry.s中,但是找了找没找到,不过细心的我-_-|||发现,entry.s include了syscall_table.s文件,看来是这个表太大了(我的syscall号是324),专门找一个文件放它.

所以在syscall_table.s中适当的位置添加系统调用的注册.
.long sys_pedagogictime
作用就相当于把这个函数的指针在一个顺序的表中.而调用号就正好是从表头开始的偏移.
由此也推断,系统调用最好不要断码^

3.在用户空间的内核头文件中加入系统调用的声明(unistd.s,我是这么做了,但是最后没用上,so在此就不说了.

编译内核.......
如何使用这个系统调用呢?
syscall函数是类似于printf函数的不定参数函数,意味着传的参数不定,由此可以推断,不论书几个参数的系统调用,都是用这个了.

调用方法:

#include
syscall(324, &timeval);

第一个数字就是系统调用的号,后面是参数.

不知道怎么编译内核才能增量编译,每次都要一个小时==半部电影阿

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