2.6.26下添加系统调用

内核版本: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中也要实现相应的系统调用接口才可以。
这只是猜测。
//不过后来我使用了#define my_syscall() syscall(SYS_my_syscall),这样来处理的。

extern long int syscall (long int __sysno, …) __THROW;
//后面加可变参数。也就是说如果我们写的系统调用需要参数的话,就直接将参数跟到其后面就可以了。

用户态测试程序:

include
#include
#include
#include
#include

#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:~$

感觉有意思?来鼓励一下!
打赏黑光技术

Leave a Reply

Your email address will not be published. Required fields are marked *