内核版本:2.6.26
以下是要修改的内核文件:
- xux@zhwen:~$ vim include/asm-x86/unistd_32.h
- #define __NR_my_syscall 327
- xux@zhwen:~$ vim arch/x86/kernel/syscall_table_32.S
- .long sys_my_syscall
- xux@zhwen:~$ vim arch/x86/kernel/sys_i386_32.c
- asmlinkage long sys_my_syscall(void)
- {
- return current->uid;
- }
完成上面的之后,从新编译内核,并用新内核启动。
以下是要修改的/usr/include/中的相关头文件。
- xux@zhwen:~$ sudo vim /usr/include/bits/syscall.h
- #define SYS_my_syscall __NR_my_syscall
- xux@zhwen:~$ sudo vim /usr/include/asm/unistd_32.h
- #define __NR_my_syscall 327
- xux@zhwen:~$ vim /usr/include/unistd.h
- /* Get the process ID of the calling process. */
- extern __pid_t my_syscall (void) __THROW;
- //现在这个加了之后不会起作用,我想应该要在glibc中也要实现相应的系统调用接口才可以。
- 这只是猜测。<br>
- //不过后来我使用了#define my_syscall() syscall(SYS_my_syscall),这样来处理的。
- extern long int syscall (long int __sysno, ...) __THROW;
- //后面加可变参数。也就是说如果我们写的系统调用需要参数的话,就直接将参数跟到其后面就可以了。
用户态测试程序:
- include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <syscall.h>
- #include <sys/types.h>
- #define my_syscall() syscall(SYS_my_syscall) //这里这样处理之后就可以直接使用
- int main()
- {
- int x = 0;
- x = my_syscall();//其实这句话和下面的这句话是一样的。
- //x = syscall(SYS_my_syscall);//这里使用syscall来调用我们自己写的系统调用函数
- printf("hello: %d \n", x );
- return 0;
- }
下面是测试结果:
xux@zhwen:~$ vim test.c
xux@zhwen:~$ gcc test.c
xux@zhwen:~$ ./a.out
hello: 1000
xux@zhwen:~$