24系统调用和libc标准库函数的联系-TeamPal-软件工程项目信息.DOC

24系统调用和libc标准库函数的联系-TeamPal-软件工程项目信息.DOC

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
24系统调用和libc标准库函数的联系-TeamPal-软件工程项目信息

内核系统调用与libc的标准库函数 总结报告 Version?: 1.0.0 2011-08-24 DOCUMENT HISTORY Ed. Version Author Change 1 孟宁 Initial(2011-08-24) 办公地点:孟宁 明德楼A302 电话:0512 E-mail:mengning@ 翟建芳 明德楼A303 电话:0512 E-mail:jfzhai@ 目 录 1 实验基本条件要求 3 2 系统调用和libc的标准库函数的概念及联系 3 2.1 什么是系统调用? 3 2.2 系统调用的实现 3 2.3 什么是标准库函数? 4 2.4 系统调用和libc标准库函数的联系 4 3 系统调用和libc的标准库函数的关系 5 3.1 与进程控制相关的系统调用及由系统调用派生出的的函数 5 3.2 与文件系统控制相关的系统调用及由系统调用派生出的的函数 6 3.3 与系统控制相关的的系统调用及由系统调用派生出的的函数 8 3.4 与内存管理相关的系统调用及由系统调用派生出的的函数 9 3.5 与网络管理相关的系统调用及由系统调用派生出的的函数 10 3.6 与socket控制相关的系统调用及由系统调用派生出的的函数 10 3.7 与用户管理相关的系统调用及由系统调用派生出的的函数 11 3.8 与进程间通信相关的系统调用及由系统调用派生出的的函数 11 4 实验要求 12 5 参考资料 12 实验基本条件要求 软件环境:windows操作系统,libc的源代码和Linux相关内核源码 系统调用和libc的标准库函数的概念及联系 什么是系统调用? 系统调用是操作系统提供给用户程序调用的一组“特殊”接口,它是内核与上层应用程序进行交互的通信的唯一接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置系统时间等。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 利用系统调用,用户在编写程序时可以使用操作系统所提供的一些子功能,比如进程控制,文件系统控制,系统控制,内存管理控制,网络管理,socket控制,用户管理,进程间通信,而不必了解系统的内部结构和有关硬件细节,从而减轻用户编程的负担,在提高系统资源利用率的同时又保护了系统的安全。 系统调用的实现 Linux中实现系统调用利用了0x86体系结构中的软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于——它是通过软件指令触发而并非外设,也就是说又编程人员出发的一种异常,具体的讲就是调用int $0x80汇编指令,这条汇编指令将产生向量为128的编程异常。 之所以系统调用需要借助异常实现,是因为当用户态的进程调用一个系统调用时,CPU便被切换到内核态执行内核函数,而进入内核——进入高特权级别——必须经过系统的门机制,这里异常实际上就是通过系统门陷入内核。 我们更详细的解释一下这个过程。int $0x80指令目的是产生一个编号为128的编程异常,这个编程异常对应的中断描述符表IDT中的第128项——也就是对应的系统门描述符。门描述符中含有一个预设的内核空间地址,它指向了系统调用处理程序:system_call()。 很显然所有的系统调用都会统一的转到这个地址,但Linux一共有2、3百个系统调用都从这里进入内核后又该如何派发它们到各自的服务程序去呢?解决这个问题的方法非常简单:首先Linux为每个系统调用都进行了编号(0—NR_syscall()),同时在内核中保存了一张系统调用表,该表中保存了系统调用编号和其对应的服务例程,因此在系统调入通过系统门陷入内核前,需要把系统调用号一并传入内核,在x86上,这个传递动作是通过在执行int0x80前把调用号装入eax寄存器实现的。这样系统调用处理程序一旦运行,就可以从eax中得到数据,然后再去系统调用表中寻找相应服务例程了。 除了需要传递系统调用号以外,许多系统调用还需要传递一些参数到内核,比如sys_write(unsigned int fd, const char * buf, size_t count)调用就需要传递文件描述符符号fd和要写入的内容buf和写入字节数count等几个内容到内核。碰到这种情况,Linux会有6个寄存器使用来传递这些参数:eax (存放系统调用号)、 ebx、ecx、edx、esi及edi来存放这些额外

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档