Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35100
  • 博文数量: 9
  • 博客积分: 128
  • 博客等级: 入伍新兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-21 11:28
文章分类
文章存档

2015年(3)

2012年(6)

我的朋友

分类: LINUX

2015-03-29 11:13:14

聂新桥 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程

这里以系统调用getpid为例子说明linux系统调用是怎么实现的。
20	i386	getpid			sys_getpid
系统调用号为20,名字是getpid,内核入口sys_getpid。
 在linux下man getpid
  写一个C程序,打印进程的pid号码。

  pid_t事实上是int类型。
使用内嵌汇编调用getpid系统调用如下:

  关于x86内嵌汇编,下面的链接讲的很好。
http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/
mov  $0x14,%%eax  是将系统调用20给eax寄存器
int $0x80         trap指令,从用户态进入内核态,执行20号系统调用
mov %%eax,$0
"=m"(pid)         系统调用的结果,即进程pid在eax寄存器里,将eax赋值到pid变量里。
=代表输出,m代表内存。直接将系统调用结果放到内存里。
 objdump -d getpid-asm | less
  mov $0x14,%eax
int $0x80
mov %eax,0x1c(%esp)
是内嵌汇编的代码,可以看出直接把eax的值放到栈esp+0x1c的内存里,这是临时变量pid的位置。   
这是程序输出./getpid的结果类似。每次执行的pid号不一样。
阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~