莱昂氏UNIX源代码分析 第12章 陷入与系统调用.pdf
文本预览下载声明
下载
第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 ”指令而产生的陷入。这种陷入是由可能的出错造成的,操作
系统对这种出错没有明确规定的处理方法 ( 除可能需要的内存映像转储外) ,而用户程序本身可
能对此已预作准备并包含有适当的处理方法。这方
显示全部