2.6.26下添加系统调用

| 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:~$ 
看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务