欢迎来到天天文库
浏览记录
ID:39465744
大小:109.50 KB
页数:12页
时间:2019-07-04
《Linux系统调用过程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux系统调用分析计算机962班周从余一.与系统调用有关的一些基本知识1.系统调用的定义在OS的核心中都设置了一组用于实现各种系统共能的子程序,并将它们提供给用户程序调用.每当用户在程序中需要OS提供某种服务时,便可利用一条系统调用命令,去调用所需的系统过程.所以说系统调用在本质上是一种过程调用.系统调用是进程和操作系统之间的接口,这些调用一般就是一些汇编指令集,在Linux系统中这些调用是用C语言和汇编编写的。用户只有通过这些系统调用才能使用操作系统提供的一些功能.2.系统调用与过程调用的区别过程调用调用的是用户程序,它运行在用户态;其被调用过程
2、是系统过程,运行在系统态下.系统调用是通过软中断机制进入OS核心,经过核心分析后,才能转向响应的命令处理程序.系统调用返回时通常需要重新调度.系统调用允许嵌套调用.3.中断与异常中断(interrupt)是由外部事件的,可以随时随地发生(包括在执行程序时)所以用来响应硬件信号。在80386中,又把中断分为两种:可屏蔽中断(MiscibleInterrupt)MI不可屏蔽中断(NonMaskableInterrupt)NMI异常(exception)是响应某些系统错误引起的,也可以是响应某些可以在程序中执行的特殊机器指令引起的.异常也分为两种:处理器异常
3、,(指令内部异常如overflow等)编程(调试)异常(debugger)每一个异常或中断都有一个唯一的标识符,在linux文献中被称为向量。指令内部异常和NMI(不可屏蔽中断)的中断向量的范围从0—31。32-255的任何向量都可以用做可屏蔽中断编程(调试)异常至于可屏蔽中断则取决于该系统的硬件配置。外部中断控制器(Externalinterruptcontroler)在中断响应周期(interrtuptacknowledgecycle)把中断向量放到总线上。中断和异常的优先级: 最高:除调试错误以外的所有错误最低:INTR中断。 中断指令INTO,
4、INTn,INT3 当前指令的调试中断下一指令的调试中断不可屏蔽中断4.Intel386提供的功能Intel386认识两种事件类:异常与中断。两者都会强制性创建一个进程或任务。中断能在任何不可预料的时间发生,来响应硬件的信号.386能辨认两种中断来源可屏蔽中断和不可屏蔽中断.并能辨认两种异常来源:处理器检测异常和程序异常每一个中断和异常都有一个号码,都对应着一个相应的矢量地址,不可屏蔽中断和处理器检测异常都已经被安排在0到31的矢量表中了,可屏蔽中断的矢量地址由硬件决定,外部中断控制器在中断认可时钟周期时将矢量地址放到总线上。任何在32到255范围内的
5、矢量,都可以作为可屏蔽中断和程序异常用。以下是所有可能的中断和异常的列表:0Divideerror 1Debugexception3NMIinterrupt4INTO-detectedoverflow5Boundrangeexceeded6Invalidopcode7coprocessornotavailable8doublefault9coprocessorsegmentoverrun10invalidtaskstatesegment11segmentnotpresent12stackfault13generalprotection14pagefau
6、lt15reserved16coprocessorerror17-31reserved32-255maskableinterrupt二.Linux系统调用的流程1.Linux系统调用的简单流程通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序(过程),并将它们提供给用户调用。每当用户在程序中需要OS提供某种服务时,变可利用一条系统调用命令,去调用系统过程。它一般运行在系统态;通过中断进入;返回时通常需要重新调度(因此不一定直接返回到调用过程)。Linux系统调用的流程非常简单,它由0x80号中断进入系统调用入口,通过使用系统调用表保存系统调用
7、服务函数的入口地址来实现.Processor调用syscallN()调用int$0x80System_call调用实际服务程序返回2.Linux系统中断和异常的使用Linux中,系统调用的执行是通过中断或异常的方式来进行的,他将执行相应的机器代码指令,来产生中断或异常信号,产生中断或异常的重要效果是系统自动将用户3模式切换为核心模式,并安排异常处理程序的执行。Linux设置了一个可屏蔽中断int0x80,我们用向量0x80来把控制传给kernel这个中断向量的设置(初始化)将在下文提到,这里就不多说了。得一提的是,存在一个syscallX()宏(x是作
8、为实际程序调用时的参数)可以方便的调用那么多的syscall.(syscallX()//usr
此文档下载收益归作者所有