分类: LINUX
2008-02-26 14:58:36
我在2.6.8中通过模块添加系统调用,发现了两个问题: 1.是sys_call_table的符号不可以被解析 2.除了283 所有的系统调用号都已经被占用 ,且没有空余。(要是想添加的系统调用号大于283,我们就要先改变unistd.h中的NR_syscalls 改的大一点,还要编译内核) sys_call_table不可以被解析的问题 ,我通过直接调用他的地址0xc02b2600实现的 这是模块程序: #include #include #include #include #include #include #include #define __NR_pedagogictime 283 static int (*saved)(void); static int sys_pedagogictime(struct timeval *tv) { struct timeval ktv; do_gettimeofday(&ktv); copy_to_user(tv,&ktv,sizeof(ktv)); printk(KERN_ALERT"PID %ld called sys_gettimeofday().\n",(long)current->pid); return 0; } int syscall(void) { long *systable; systable=(long*)0xc02b2600; saved=(int(*)(void))(systable[__NR_pedagogictime]); systable[__NR_pedagogictime]=(unsigned long)sys_pedagogictime; return 0; } void exit_syscall(void) { unsigned long *systable; systable=( long*)0xc02b2600; systable[__NR_pedagogictime]=(unsigned long)saved; } module_init(syscall); module_exit(exit_syscall); 把上边这个模块编译成syscall.ko后 加载到内核我们就可以实用这个系统调用了 这是一个应用这个系统调用的程序 #include #include #define __NR_pedagogictime 283 _syscall1(int,pedagogictime,struct timeval *,thetime) struct timeval tv; int main() { //struct timeval tv; pedagogictime(&tv); printf("tv_sec:%ld\n",tv.tv_sec); printf("tv_nsec:%ld\n",tv.tv_usec); printf("em...,let me sleep for 2 second.:)\n"); sleep(2); pedagogictime(&tv); printf("tv_sec:%ld\n",tv.tv_sec); printf("tv_nsec:%ld\n",tv.tv_usec); } |