- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第10章 系统调用接口 系统调用接口的功能 内核为用户与硬件设备(例如:CPU,磁盘,打印机等)交互提供了一个接口。该接口被称为系统调用接口。它的功能是: 10.1 API和系统调用 UNIX操作系统为编程员提供了应用编程接口(API)。 在API提供的libc标准函数库中,一部分是用户态的库函数,另一部分是系统调用。库函数和系统调用的区别是: 为了区别库函数和系统调用,libc标准C库中,每个系统调用都有一个封装例程(wrapper routine)。 应用程序通过这个封装例程来引用API函数库中的系统调用。 用户执行一个系统调用时,内核通过 (int 0x80)软件中断或调用门从用户空间进入内核空间,这就是所谓的模式转换。 CPU切换到内核态开始执行与系统调用相对应内核函数。执行结束后内核将执行结果和控制权还给用户进程。 图10-6给出调用系统调用的示意图。 调用一个系统调用示意图 10.2 模式转换的硬件处理 在i386中,完成系统调用接口模式转换的硬件是陷阱门和调用门,软件是int 0x80指令或调用指令 10.2.1 陷阱门模式转换 系统调用属于软件中断。 i386保护模式下的软件中断使用陷阱门描述符。 10.3 系统调用接口 i386保护模式下,系统调用接口由软件和硬件共同协作完成。 下面讲解系统调用处理程序system_call的工作原理。 10.3.1 初始化系统调用 系统启动内核初始化期间调用trap_init函数建立IDT表中向量号为128对应的表项(8个字节的陷阱门描述符)。代码如下: set_system_gate()初始化80H开始的8个字节的陷阱门描述符。步骤如下: 10.3.2 系统调用执行流程 10.3.3 封装例程 system_call()是系统调用入口点。 系统调用主要供用户编程使用,但也可以被内核态线程调用。 为了简化系统调用的调用过程,Linux提供的封装例程是一组预处理宏。共定义了6个宏: 封装例程的解释 _syscallN中的“N”是系统调用的参数个数。 可以按照程序清单10-1把_syscall3(int,write,┅)宏展开成下面的代码: 对这个函数进行编译,生成的汇编代码如下: 10.3.4系统调用号与系统调用表 system_call()函数是内核中所有系统调用的唯一入口点,因此内核要为每个系统调用编一个序号,这个序号叫做系统调用号。 从上一节的封装例程代码中可以看到,执行int 0x80之前,系统调用号已被放在eax中。 程序清单10-2给出了部分系统调用号。 系统调用表 系统调用表是指向各系统调用函数指针组成的表。 系统调用号是系统调用表中各表项的相对偏移量。 执行system_call()时,根据eax中的系统调用号,定位该系统调用函数在系统调用表(sys_call_table)中的准确位置。 程序清单10-3给出了部分系统调用表。 10.3.5system_call 的执行过程 系统执行int $0x80指令进行模式转换时,核心栈的布局如图10-5所示。 函数system_call()的源代码如下: 函数system_call()是所有系统调用的入口点。在源代码中的调用语句是: 当服务例程执行结束时,可以从eax中获得返回值,并把这个返回值进栈保存。 当进程恢复到自己的用户态执行时,就可以在eax中找到该系统调用的返回值。 10.5 添加新系统调用实例 通过学习向内核添加一个新系统调用的过程,进一步理解系统调用的基本原理。 连接新的系统调用,将ptimeofday.c代码添加到/usr/linux/kernel/sys.c文件中,同时需要重新编辑2个文件: 编译新的Linux内核。编译内核要以超级用户身份登录,命令行如下: 启动新的内核操作系统: 尝试使用新的系统调用。 10.6 小结 本章重点讨论和分析了内核向用户程序提供的编程接口:系统调用接口。 为了加深理解,本章最后给出了一个编写新系统调用的编程实例。 # make xconfig # make dep # make bzImage 编译结束后,系统将产生一个新压缩的内核映像文件: # usr/src/linux/arch/boot/bzImage 壶馋讹旗嚎先莫逻逃眶票傲荆累怠抹关二熙菏颠吵入必霓嫂滚渊糟女砾矢第10章 linux系统调用接口第10章 linux系统调用接口 为了安装新系统内核,应该将上面产生的新内核映像文件拷贝到/boot/目录下: # cp usr/src/linux/arch/boot/bzImage /boot/bzImage-new 如果你的机器使用grub加载OS,可参照教材表8-2内容修改/etc目录下的grub.conf文
您可能关注的文档
最近下载
- 房屋建筑加固改造工程施工重点及难点分析与对策.pdf VIP
- 【基恩士】LR-W500(C) 使用说明书 (简体中文).pdf VIP
- 2025年全国危险化学品经营单位主要负责人考试试题含答案.docx VIP
- 依利特MFD3100多波长荧光检测器用户手册.pdf VIP
- 医疗气体系统施工的质量监控重点及监理措施(可编辑word版).doc VIP
- 《西门子接口模块 ET 200M IM 153 2 产品手册 中文超清版》.pdf VIP
- 压力性尿失禁的护理查房PPT课件.pptx VIP
- 九年级下册化学《金属》习题巩固.doc VIP
- 索尼sony_mdsje480_使用说明书手册.pdf VIP
- 城市管理网格员(中级)考试题库(浓缩300题).docx VIP
文档评论(0)