郑杰A-,A(fork).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
郑杰A-,A(fork)

Linux系统调用fork分析报告 计算机系96级1班 郑 杰 9615103 系统调用是操作系统和用户之间的界面,它由系统核心设定,为用户提供各种系统服务。用户以软中断的方式发出系统调用,系统核心响应以执行对应的系统调用服务程序。Linux处理系统调用的流程是这样的:先通过int $0x80中断进入系统调用入口,根据中断参数知道用户需要的系统调用在系统调用表(sys_call_table)中的偏移量,从而找到了系统调用服务程序的入口地址,进而去执行该程序。 本报告分两部分:第一部分大致分析一下系统调用的流程,第二部分分析其中用于创建新进程的重要的系统调用fork的工作过程。重点放在第二部分。 系统调用简述 我们可以这样理解:所有系统调用合在一起是其实是一种中断,就是int $0x80,系统初始化的时候,int $0x80和其它中断向量一样,中断服务程序入口地址被存入中断向量描述表中,其中第0x80项保存的即系统调用的入口地址。 各种trap入口都是在文件”\Arch\I386\Kernel\Traps.c”中的trap_init()函数设置的,其中0x80入口由语句 set_system_gate(0x80,system_call);完成。set_system_gate()是一个宏,在”Include\Asm-i386\System.h”中有它的宏展开: #define set_system_gate(n,addr) \ _set_gate(idt[n],15,3,addr) 其中“_set_gate()”也是在该文件中定义的宏: #define _set_gate(gate_addr,type,dpl,addr) \ __asm__ __volatile__ (“movw %%dx,%%ax\n\t” \ “movw %2,%%dx\n\t” \ “movl %%eax,%0\n\t” \ “movl %%edx,%1” \ :”=m” (*((long *) (gate_addr))), \ “=m” (*(1+(long *) (gate_addr))) \ :”i” ((short) (0x8000+(dpl13)+(type8))), \ “d” ((char *) (addr)),”a” (KERNEL_CS 16) \ :”ax”,”dx” 这段宏的主要功能是使addr地址放入gate_addr所指向的内存单元中,那么语句set_system_gate(0x80,system_call);的含义就很明显:把中断向量描述表的第0x80项置为system_call。 从上面可以断定,真正的系统调用入口是system_call。从int $0x80到system_call这中间有很多工作要做,源代码主要在”\Include\Linux\Sys.h”文件,这里有许多汇编语句,我没来得及仔细分析,只知大致做的工作是传递参数到pt_regs结构变量中,那里有许多寄存器。其中最关键的是eax寄存器,它作为区别系统调用类型的唯一参数,其实是系统调用的序号。Linux定义了设置系统调用入口的宏,_syscallX(type,name, type1,arg1,type2,arg2……),其中X表示系统调用的参数个数。关键工作就在这里完成,它的宏展开令人头昏脑胀,目前还未很清楚。因为重点放在fork的分析,这里不再详述。 下面简单扫描一下system_call做了什么。 SAVE_ALL 保存现有的通用寄存器值。 检测系统调用是否合法: cmpl $(NR_syscalls),%eax; 比较NR_syscalls与eax寄存器的值,如果NR_syscalls小于eax,则出错,马上到ret_from_sys_call 返回。 找到用户所需的系统调用服务程序入口地址,将其存入eax 源代码:movl SYMBOL_NAME(sys_call_table)(,%eax,4),%eax 这是把eax寄存器中的内容(系统调用的序号)与4相乘,作为sys_call_table的偏移量,从那里取出的内容即是所需。 然后是许多琐屑的初始化工作,之后便进入系统调用服务程序去执行了。 看来,sys_call_table是其中的关键,(最初我把它同中断向量表混淆了),这是在文件 “\Arch\I386\Entry.s”中定义,其中保存了Linux的166个系统调用入口地址,事实上,x86机器上最多可容纳256个系统调用,所以用户定义自己的系统调用也是可以的。下面让我们浏览一下这个表的部分内容: ENTRY(sys_

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档