当前位置: 技术问答>linux和unix
在linux kernel 里添加了系统调用,如何在用户程序中调用添加的系统调用呢?急
来源: 互联网 发布时间:2016-05-24
本文导语: 在内核里我添加了一个int sumsquare(int a, int b) {return a*a+b*b;}用于计算两个整数的平方和,但是在用户程序中,我是这样写的: #include #include #include #define __NR_sumsquare 326 int main() { int c = syscall(__NR_sum...
在内核里我添加了一个int sumsquare(int a, int b) {return a*a+b*b;}用于计算两个整数的平方和,但是在用户程序中,我是这样写的:
#include
#include
#include
#define __NR_sumsquare 326
int main()
{
int c = syscall(__NR_sumsquare, 2, 3);
printf("The result is :%dn", c);
return 0;
}
但是测试发现c的值为-1,也就是说 syscall 函数调用失败, errno=38, 错误号是38, 请问大家知道这是为什么吗?感激不尽
#include
#include
#include
#define __NR_sumsquare 326
int main()
{
int c = syscall(__NR_sumsquare, 2, 3);
printf("The result is :%dn", c);
return 0;
}
但是测试发现c的值为-1,也就是说 syscall 函数调用失败, errno=38, 错误号是38, 请问大家知道这是为什么吗?感激不尽
|
系統定義是由內核提供的功能,本來由內核提供的時候,都是以多少多少號系統調用的形式提供的,這個號碼可
以參見這個文件:/usr/include/asm/unistd_32.h
但是準確的講,這個文件并不是由內核提供的,而是由glibc來實現的,它講抽象的系統調用號用宏來定義一下,
然後和函數的名字關聯起來,這樣就有了C的接口了。而系統調用本身都是用彙編來寫的。比如fork()系統調用,
在0.11版本的內核裡面是這樣定義的:
#define __NR_fork 2
然後會有下面的接口定義:
extern int sys_fork();
這是實現部分:
.align 2
sys_fork:
call find_empty_process
testl %eax,%eax
js 1f
push %gs
pushl %esi
pushl %edi
pushl %ebp
pushl %eax
call copy_process
addl $20,%esp
1: ret
然後會定義系統調用的函數指針列表,根據下標值,就可以索引到系統調用對應的C接口了:
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid };
以參見這個文件:/usr/include/asm/unistd_32.h
但是準確的講,這個文件并不是由內核提供的,而是由glibc來實現的,它講抽象的系統調用號用宏來定義一下,
然後和函數的名字關聯起來,這樣就有了C的接口了。而系統調用本身都是用彙編來寫的。比如fork()系統調用,
在0.11版本的內核裡面是這樣定義的:
#define __NR_fork 2
然後會有下面的接口定義:
extern int sys_fork();
這是實現部分:
.align 2
sys_fork:
call find_empty_process
testl %eax,%eax
js 1f
push %gs
pushl %esi
pushl %edi
pushl %ebp
pushl %eax
call copy_process
addl $20,%esp
1: ret
然後會定義系統調用的函數指針列表,根據下標值,就可以索引到系統調用對應的C接口了:
fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,
sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,
sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chmod,
sys_chown, sys_break, sys_stat, sys_lseek, sys_getpid, sys_mount,
sys_umount, sys_setuid, sys_getuid, sys_stime, sys_ptrace, sys_alarm,
sys_fstat, sys_pause, sys_utime, sys_stty, sys_gtty, sys_access,
sys_nice, sys_ftime, sys_sync, sys_kill, sys_rename, sys_mkdir,
sys_rmdir, sys_dup, sys_pipe, sys_times, sys_prof, sys_brk, sys_setgid,
sys_getgid, sys_signal, sys_geteuid, sys_getegid, sys_acct, sys_phys,
sys_lock, sys_ioctl, sys_fcntl, sys_mpx, sys_setpgid, sys_ulimit,
sys_uname, sys_umask, sys_chroot, sys_ustat, sys_dup2, sys_getppid,
sys_getpgrp, sys_setsid, sys_sigaction, sys_sgetmask, sys_ssetmask,
sys_setreuid,sys_setregid };