Chinaunix首页 | 论坛 | 博客
  • 博客访问: 295166
  • 博文数量: 56
  • 博客积分: 3025
  • 博客等级: 中校
  • 技术积分: 534
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 17:28
个人简介

Honesty and diligence should be your eternal mates.

文章分类

全部博文(56)

文章存档

2012年(1)

2011年(27)

2010年(20)

2008年(8)

分类: LINUX

2010-12-03 09:43:10

   系统调用的执行过程分为两个阶段:从用户空间到系统空间;从system_call函数到系统调用服务例程。

1、从用户空间到系统空间:

   不同平台有不同的指令来完成从用户空间到系统空间的转换,这类指令被称为操作系统陷入指令。对于x86体系来说,通过软中断int 0x80实现。通过该指令,系统会转到一个预设的内核空间地址。这个地址就是系统调用处理程序system_call函数。

2、从system_call函数到系统调用服务例程:

   执行int 0x80之后,系统调用的参数会被保存在eax、ebx、ecx、edx、esi、edi寄存器中。eax传递的是系统调用号。系统调用号乘以4作为偏移地址再加上sys_call_table的基址就得到了系统调用服务例程的地址。
除了找到系统服务例程的地址外,还把寄存器中的参数压栈。因为系统调用服务例程只能从堆栈中获得参数。

   在系统调用服务例程执行完之后,用户程序可直接从寄存器中获得被修改过的参数。

   注意:system_call执行用的是进程的上下文而不是中断的上下文。
阅读(1770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~