Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24442
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-25 10:41
文章分类
文章存档

2015年(1)

2014年(4)

我的朋友

分类: LINUX

2014-10-26 17:17:15

kernel-3.13.3

实际上相当简单。
首先得有一个系统调用表,这个表在内核代码中以一个全局可见的数组存在:
    位置在arch/x86/kernel/syscall_32.c,用于初始化的表项定义在另一个文件:arch/x86/include/generated/asm/syscalls_32.h,可以看到,x86下的系统调用共有329个,对应编号范围0~350,中间有几个号码没用到。
写个实验小程序验证

  1. int main( int argc, char **argv )
  2. {
  3.     int fd;
  4.     fd = open( "/dev/null", 0_WRONLY );
  5.     write( fd, "test", 4 );
  6.     close( fd );
  7.     return 0;
  8. }
编译后,用gdb看看它的汇编代码,分别在open, write, close处设置断点,然后用disass $pc,得到以下结果:




验证了open系统调用号为5,write为4,close为6。(这里有两种方式从用户态进入内核态:int 0x08 和 call *%gs:0x10,如果无需了解x86微架构,可以认为它们等价)
阅读(1898) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:gdb如何查看成员变量在结构体中的偏移量

给主人留下些什么吧!~~