(莱昂氏unix源代码分析导读-5) 中断与陷入初探

对于中断,大家应该都比较熟悉。莱昂氏书中的第9章对这部分也有精彩的讲解,一定要多读多看,确保深入理解。

我在这里还是啰嗦几句。

1)中断由其他硬件(非CPU)产生的,带有优先级,如CPU当前优先级高于中断优先级,该中断不会被马上处理。

         硬件产生的最高优先级中断为6。因此,将CPU priority设置为7时,可屏蔽硬件中断。代码中有大量这样的设置,

          refer to PS register的讲解部分。

 

2)陷入为CPU内部事件,无优先级,必须马上处理;

3)中断或陷入处理流程

     1)将当前PCPS暂存;

     2)通过中断矢量表重装PCPS(一定为核心态);

     3)将原先的PCPS压入当前栈;

     4)执行(即中断矢量表中指向的地址)

     5)执行中断例程后,根据压入的PC,返回原来的程序地址,并恢复PS。

              PDP11提供了rtt指令来完成这一操作。

 

PDP11提供了trap指令,可以“引发”一个“陷入”,如图所示:

Trap指令会引发如下事件:

(1)         PS <---- (36)  (切换到核心态)

(2)         PS压入核心栈;

(3)         pc压核心栈;

(4)         pc<----中断矢量(34)处执行。

 

需要注意的有两点:

(1)         trap指令一般用于系统调用(system entry)的实现,而“中断模拟”指令为“emt”,该指令与“trap”十分相似,

                   唯一的不同是其中断矢量地址为(30)

(2)         trap指令code横跨104400~104777

                  其中后8bit可被看着system entry no,也就是说最多有2560~255)种系统调用。

                 【注】:本版本的unix使用了后6位,也就是说支持64system call

 

最后,让我们检查一下中断矢量表的源码:

502   br4   = 200

503   br5   = 240

504   br6   = 300

505   br7   = 340

506

507     .=0^.                        当前地址 = 0 octal

508     br        1f                  地址0~1

509     4                             地址2~3(指令IOT。执行20octal的中断)

510

511 / Trap Vector

512     trap; br7+0;                  /bus error

                                                 /地址4~7,中断矢量地址为4

                                                 /PC指向Trap例程,PS设置为340(优先级7

513     trap; br7+1;                   /illegal instruction(地址10~13,中断矢量地址为10

514     trap; br7+2;                   /bpt trace trap(地址14~17,中断矢量地址为14

515     trap; br7+3;                   /iot  trap(地址20~23,中断矢量地址为20

516     trap; br7+4;                   /power fail(地址24~27,中断矢量地址为27

517     trap; br7+5;                   /emulator trap(地址30~33,中断矢量地址为30

518     trap; br7+6;                   /system entry(地址34~37,中断矢量地址为34——就是trap指令的中断矢量地址啦

 519

             ……

525     .=60^.                       当前地址设置为60 octal

526     klin; br4                      /(地址60~63,中断矢量地址为60

527     klou; br4                      /(地址64~67,中断矢量地址为64

             ……

540     .=200^.                       当前地址设置为200 octal

541     lpou; br4;                     /(地址200~203,中断矢量地址为200

         ……

【注】:代码中的“trap”并非是trap指令,而是定义于第755行的“subroutine”。

                0755: trap:

                unxi源码中有大量这样的“重名”现象,容易给人带来混乱,需要格外注意。

 

不妨跟书中的两个列表比较一下:

矢量单元

陷入类型

处理机优先权

010

非法指令

7

0 14

BPT跟踪

7

020

Iot

7

030

仿真陷入指令

7

034.

Trap

7

注:仿真陷入指令,即emt指令

 

矢量单元

外部设备中断

优先级

处理机优先权

060

电传打字机输入

4

4

064

电传打字机输出

4

4

200

行式打印机

4

4

 

博客地址: http://blog.csdn.net/cszhao1980

 

你可能感兴趣的:(unix,vector,System,代码分析,subroutine)