adjustment to the CPU
when the results computed by ALU shows that there is an error,
then add a signal path from ALU to PC UPDATE
now PC update have 3 choice to update its value:
1.PC+4
2.JUMP instruction PC+offset*4
3.when the error signal is valid PC -> 0 ,which means it turns to address 0 ,execute few instructions from address 0 to rectify the mistakes or show there is an error.
you can also record the PC value then error occurs, so next time you can jump back to the PC value and then continue the execution.
what is interruption and exception
the original way to handle exception and interruptoin
interrupt vector
how intel 8086 divide its address space?
中断向量用来存储address which process the interruption
IP 存放在指令指针寄存器
CS 存放在代码段寄存器
IP,CS寄存器参见https://blog.csdn.net/qq_35212671/article/details/52752808
总的来说,CS:IP 两个寄存器指示了 CPU 当前将要读取的指令的地址。
当要执行一个可执行文件的时候,shell程序会把CS:IP寄存器设置这个程序的初始地址,然后CPU从这个地址开始读取指令
逻辑地址生成物理地址
中断向量表要在系统启动的时候进行初始化
一个中断向量占4个字节,1共有1KB空间用来存放中断向量,因此一共有256个中断向量。
CPU发现中断的时候,如果是1号,转向1号中断向量。由于中断向量的位置是固定的,CPU只需要通过硬件电路来访问中断向量,不需要通过软件。而且CS是段基值,IP是偏移量,根据段偏移计算方法:
对应地址为43006H
因此转到存储器里面的40996H,执行处理1号中断的服务程序。
注意终端服务程序存放顺序不固定
exercise
中断类型码就是中断向量序号,由于第0个中断向量是存放在地址0的,因此中断向量码与其存放地址的关系就是 地址 = 向量码×4
10H 20H 对应IP寄存器 30H 40H 对应CS寄存器
因此地址为 4030:2010H
23 40 对应CS寄存器
78 90 对应IP寄存器
因此字节单元对应的内容分别为
23
40
78
90
(从上往下地址减少)
中断向量表的发展
1.回顾一下,实模式下,地址是有CS寄存器×4 + IP寄存器 来产生一个20位的地址来实现的
2.但是现在EIP的寻址能力和32位地址线寻址范围是对应的,因此保护模式下寻址方式和实模式有所不同。
IA-32的存储器寻址
1.保护模式下,段基址不在CS中,而在内存中
为什么会有8192个描述符?
因为CS寄存器寻址能力是16位,可以寻找2^16也就是64K个地址,也就是8192个描述符
而这时候由于不知道起始地址,因此需要一个GDTR寄存器,来存储描述符0所在的地址。这是一个系统寄存器,在系统启动的时候就写好。
#####总结流程:
1.GDTR 结合 CS 寄存器,用来访问存储器中的描述符
2.然后从描述符当中提取出4个保存着基地址的字节,把得到的基地址与EIP指针寄存器结合,得到所要访问的寄存器的地址
保护模式的中断操作
中断向量表
这时候由于地址不是从0开始的,因此与上图类似,CPU需要一个IDTR来记录描述符0所在的地址。
这时候CPU把 (中断类型号 * 8 + IDTR),得到描述符的地址,然后从描述符中选取2个段选择符字节放到CS寄存器,字节0,1,6,7放到EIP寄存器,(理解为偏移量)。记住实模式下,段基址并不是在CS中,而是需要用CS到内存中寻找。
所以当从中断向量取回CS与EIP后,要利用CS和GDTR结合,来寻找段基址,再把段基址与EIP结合,这样最后才能得到中断服务程序的入口地址
与实模式下的不同:
实模式下中断向量4个字节,其中低位的两个放到IP寄存器,高位的两个放到CS寄存器
中断处理过程
根据上图: 发生中断的时候先压栈,保存好处理完中断后应该返回的地址的信息。
Flags保存好标志,以免处理的时候会改变某些标志位。
清楚IF-TF 起到关中断的作用???
然后再从存储器找到中断向量,取到CS、IP之后就找到了终端服务程序的入口地址。
总结:
集中内部中断的类型:
注意上述两种中断类型的时机是不同的哦。
中断类型0 是在检测出异常的时候立即发生,而内部中断需要自己主动执行INTO指令才可以检测出来
为什么INT n是两字节指令? 因为 INT 指令操作码 首先占一个字节 ,然后n范围是0-255 需要8位来表示,所以用2个字节。
那为啥INT 3用1个字节呢?
因为x86地址最短的就是一个字节。如果INT 3 是两个字节或以上,可能会覆盖掉下面的指令的一些字节。
例如:
OFFSET instruction 1, one byte
OFFSET+1 instruction 2, one byte
如果在inst1设置断点,则而且inst1内容是跳到inst2,则替换的时候INT 3会把inst2某些字节覆盖掉。那么就不能实现跳到inst2的指令了。
OFFSET INT3……………….
OFFSET+1 ………………….
详情参考 http://www.cs.columbia.edu/~junfeng/09sp-w4118/lectures/int3/int3.txt
INT 3对应的中断服务程序可以查看 AL寄存器的值