| 2009年5月13日
内核版本: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:~$
关注「黑光技术」,关注大数据+微服务