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) |