文档详情

莱昂氏UNIX源代码分析 第12章 陷入与系统调用.pdf

发布:2017-12-23约8.25千字共6页下载文档
文本预览下载声明
下载 第12章 陷入与系统调用 本章说明系统处理陷入的一般方式以及处理系统调用的特殊性。 有很多条件会造成处理机“陷入”。其中有些显然是出错条件,例如硬件或电源故障, U N I X 并不企图采用任何相当复杂的方法进行故障恢复。 我们的注意力集中于“t r a p . c ”文件中的主要过程。 12.1 trap(2693) 调用此过程的方法在第 1 0章中已经说明。用汇编语言编写的“ t r a p ”例程执行某些基础性 的内务处理,建立起了核心栈中的有关部分,所以当调用此过程时,似乎一切都已准备妥当。 “t r a p ”过程可视为是由另一个“ C ”过程带7个参数以一般方式调用的,这 7个参数及它 们的顺序是: d e v , s p , r 1 , n p s , r 0 , p c , p s 顺便要在这里提及的是一个特殊之处。通常,传送给“ C ”过程的所有参数都采用传值方 式。如果被调用的过程在执行中更改了参数值,这不会直接影响到调用过程。但是若“ t r a p ” 或中断处理程序更改了它们的参数值,那么这些新值在恢复“前状态”寄存器时都可以取得。 在陷入后立即取得处理机状态字的值,然后掩蔽除最后 5位的其他各位,这样就可获得 “d e v ”的值。在进行掩蔽处理之前,用相应矢量单元中的原型值以及陷入前的处理机状态设 置处理机状态字。若矢量单元第 2个字的值是“b r 7 + n ;”( 0 5 1 6行) ,那么“d e v ”的值将是n 。 2 6 9 8 :“s a v f p ”保存浮点寄存器(对于P D P 11 / 4 0来说,这不执行任何操作 ! )。 2 7 0 0 :若前状态是“用户态”,则对“d e v ”的值进行修改,使其加8进制值0 2 0 ( 2 6 6 2 ) 。 2 7 0 1 :将栈中存放r 0 的单元地址存放在“u . u _ a r 0 ”中以供以后引用。(结果是:各寄存器 值可用u . u _ a r 0 〔R n 〕引用。) 2 7 0 2 :这是一个依赖于“d e v ”值的多路选择语句。 到此为止我们可以观察到,按照处理机前状态及陷入原因 U N I X将陷入分成三类: 1) 核心态。 2) 用户态,并非由“t r a p ”指令造成的陷入。 3) 用户态,由于“t r a p ”指令造成的陷入。 12.2 核心态陷入 除一个例外,这种陷入是不能预期的。对此种陷入的处理是执行“ p a n i c ”。所执行的代码 是“s w i t c h ”语句的“d e f a u l t ”部分: 2 7 1 6 :打印: • 第7核心态段地址寄存器的当前值 (亦即当前的p p d a (每个进程数据区) 的地址) 。 第12章 陷入与系统调用 283 下载 • 在核心态栈中存放“p s ”单元的地址。 • 陷入类型编号。 2 7 1 9 :调用“p a n i c ”,该过程并不返回。 浮点操作仅由用户态程序使用,核心态程序不使用浮点操作。因为在 P D P 11 / 4 5 和 P D P 11 / 7 0 中浮点操作是以异步方式执行的。所以当一个浮点异常发生时,处理机可能已切换 至核心态进行中断处理。于是,在核心态下发生的浮点异常陷入可以判断为是由当前用户程 序造成的。 2 7 9 3 :调用“p s i g n a l ”( 3 9 6 3 ) ,它设置一标志表示已发生浮点异常。 2 7 9 4 :返回。 在这里可以提示一个有趣的问题:“为什么对核心态和用户态下发生的浮点异常的处理会 稍有不同呢? ” 12.3 用户态陷入 首先考虑并非由执行“ t r a p ”指令而产生的陷入。这种陷入是由可能的出错造成的,操作 系统对这种出错没有明确规定的处理方法 ( 除可能需要的内存映像转储外) ,而用户程序本身可 能对此已预作准备并包含有适当的处理方法。这方
显示全部
相似文档