kernel-3.13.3
实际上相当简单。
首先得有一个系统调用表,这个表在内核代码中以一个全局可见的数组存在:
位置在arch/x86/kernel/syscall_32.c,用于初始化的表项定义在另一个文件:arch/x86/include/generated/asm/syscalls_32.h,可以看到,x86下的系统调用共有329个,对应编号范围0~350,中间有几个号码没用到。
写个实验小程序验证
-
int main( int argc, char **argv )
-
{
-
int fd;
-
fd = open( "/dev/null", 0_WRONLY );
-
write( fd, "test", 4 );
-
close( fd );
-
return 0;
-
}
编译后,用gdb看看它的汇编代码,分别在open, write, close处设置断点,然后用disass $pc,得到以下结果:
验证了open系统调用号为5,write为4,close为6。(这里有两种方式从用户态进入内核态:int 0x08 和 call *%gs:0x10,如果无需了解x86微架构,可以认为它们等价)
阅读(1892) | 评论(0) | 转发(0) |