对于中断,大家应该都比较熟悉。莱昂氏书中的第9章对这部分也有精彩的讲解,一定要多读多看,确保深入理解。
我在这里还是啰嗦几句。
(1)中断由其他硬件(非CPU)产生的,带有优先级,如CPU当前优先级高于中断优先级,该中断不会被马上处理。
硬件产生的最高优先级中断为6。因此,将CPU priority设置为7时,可屏蔽硬件中断。代码中有大量这样的设置,
refer to PS register的讲解部分。
(2)陷入为CPU内部事件,无优先级,必须马上处理;
(3)中断或陷入处理流程
(1)将当前PC、PS暂存;
(2)通过中断矢量表重装PC、PS(一定为核心态);
(3)将原先的PC、PS压入当前栈;
(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
其中后8个bit可被看着system entry no,也就是说最多有256(0~255)种系统调用。
【注】:本版本的unix使用了后6位,也就是说支持64种system 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