- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux的系统调用实现机制与系统调用实例分析-Jin-Yang.doc
Linux的系统调用实现机制与系统调用实例分析
姓名: 杨骏 班级: 混合964 学号: 9630130 教师: 李善平
一. 前言
众所周知,系统调用是操作系统中必不可少的一个组成部分. 尤其对于以该操作系统作为平台进行程序设计的程序员来说,系统调用提供了该系统面向用户的编程界面, 程序中所有与系统有关的代码的实现都必须通过这些接口来完成,了解系统调用的一整套机制有十分重要的意义. 同时,在分析Linux的系统调用机制的时候,就与分析Linux其他部分的源代码一样总能发现非常巧妙的数据结构与算法,如使用了在高级语言中嵌入汇编代码来实现所有系统调用的公共入口,大大提高的系统运行的效率.
本文分为两部分:第一部分详尽地分析了Linux系统调用的一整套机制,并给出流程图; 第二部分用具体的系统调用为实例对系统调用的实现代码进行分析.
在阅读代码时遇到一些疑难之处,在文章中都使用了”猜测为”注明,表示该部分的分析没有充分的依据.如有错误之处,希望读者给予指正.
二. 预备知识
INTEL x86的汇编语法
由于在系统调用的公共入口的代码是由汇编语言写成,而32位的INTEL x86芯片的汇编语法与传统的IBM PC/XT汇编语法有较大的差别,因此这里给出简单的说明:
.特有的寄存器名
eax, ebx, esp等以’e’开头的寄存器都是32位的扩展寄存器
db7等为调试寄存器
.特有的符号
$ : 表示这是立即数
%: 表示这是寄存器
(): 表示用括号内的值作为地址值进行间接寻址
* : 表示取出该地址下的内容
.双操作数指令赋值方向与原来相反
如movl $23, %eax
表示将立即数23赋值给寄存器eax
C语言中嵌入汇编代码及进行参数与返回值传递的方法
C语言中嵌入汇编代码的常见格式如下:
__asm__ volatile (int $0x80
: =a (__res)
: 0 (__NR_##name), b ((long)(arg1)),c ((long)(arg2)),
d ((long)(arg3)));
各种符号的含义如下:
__asm__: 嵌入汇编。
=a (__res): 将调用int 0x80之后寄存器eax作为返回值传给
变量__res
0 (__NR_##name): 将__NR_与变量name做字符串拼接后传给寄存器eax作为调用int 0x80的参数
b ((long)(arg1)): 将变量arg1强转化成long型变量后传给寄存器ebx作为调用int 0x80的参数
其余的字符与汇编中寄存器之间的关系如下表:
“S”: 寄存器esi “D”: 寄存器edi
“d”: 寄存器edx “c”: 寄存器ecx
三.Linux的系统调用的实现机制
重点分析文件:
unistd.h /usr/src/linux/include/asm/unistd.h
Linux中系统调用函数的基本框架及与系统调用公共入口(汇编实现)相接部分
entry.S /usr/src/linux/arch/i386/kernel/entry.S
用汇编代码实现的系统调用公共入口及系统调用直到返回的全过程,以及存放系统调用偏移表
3.1系统调用与中断机制之间的关系
在Linux中, 所有的代码可能具有以下的两种特权级别: 用户态和核心态. 由于系统调用往往是要求对系统所拥有的资源进行操作, 这些操作是由用户发出请求而由操作系统本身完成, 所以它具有核心态. 由于系统调用的总数很多, 为了程序的简化和效率起见, 采用了中断0x80作为所由系统调用的公共入口. 即任何一个系统调用都引发中断0x80并通过它进入到核心态, 再有该中断的处理函数来具体决定对不同的系统调用的具体处理.
对在Intel X86芯片上运行的Linux中断机制简述如下:
1. 在Linux中中断可以分为两类: 软中断(也可称其为异常)和硬中断
硬中断――由Linux的硬件电路触发, 用来与外部设备通信及各I/O操作, 其发生具有不可预测性. 硬中断中又可根据该中断是否可以被屏蔽分为可屏蔽中断和不可屏蔽中断(NMI).
软中断――由用户程序或操作系统本身的指令引发, 目的是完成一定的系统功能.
Linux中由中断向量表来管理中断.
每个中断对应一个中断号, 以该中断号作为下标在中断向量表中对应一长为4个字节的中断向量用于表示该中断服务函数的入口地址. Linux中共可有256类中断, 则对应着1KB长的中断向量表. 表的结构大体如下:
中断号 中断类型 0 除零中断 1 调试中断 2 NMI 不可屏蔽中断 3 Break Point断点中断 4 由INT
您可能关注的文档
- CSP方案之Azure档案备份及还原CSPCloudServiceProvider方案系.PDF
- D006技术转让(技术秘密)合同-广西大学科技处.doc
- DB33T 30041-2015 农村厕所建设和服务规范 第1部分:农村改厕管理规范.pdf
- DGUT-CG-1621东莞理工学院综合教学楼厕所隔板更换项目.doc
- DHSP1GC-3KTL光伏非隔离并网逆变器使用说明书东方日立(成都)电.PDF
- DiscoverySeriesSelectorizedLine力量健身设备用户手册-Precor.PDF
- Disco厅扩声系统.ppt
- DTTN服务登记表.PDF
- EAS适用用途别科目名称适用用途别科目名称、定义及-行政院主计总处.PDF
- EB0BUL]BHNA20152015上海酒店工程与设计展览会建筑陶瓷.PDF
文档评论(0)