中断学习笔记

基础知识:

中断的功能:用户态内核态的转换、设备的访问

中断分类:(不是很确定)

1.中断(外中断、硬件中断、异步中断)

2.异常(内中断、软中断、同步中断)

所谓内外就是CPU内外;异步中断就是CPU每执行完一条指令都要自己检查一下是不是有中断,同步中断就是在CPU执行指令的过程中指令造成的中断;

外中断又分为不可屏蔽和可屏蔽中断;

外中断中的可屏蔽中断需要设置IMR(中断屏蔽寄存器)和IF位,只有这两个同时打开是CPU才会响应对应的中断,内中断不需要这些;

这里说个概念,我们经常说的系统调用其实就是软中断中的int n指令;

准备中断向量表/IDT和中断处理程序是操作系统来完成的,外中断中的可屏蔽中断的中断类型码的取得是由硬件(8259A)来完成的(程序员无法改变这个过程要做的工作);

系统设定好的中断处理程序都是运行在内核态的,当然也可以自己定义一些中断和中断处理程序同时定义该处理程序运行在哪个级别;


一、实模式下中断(80x86)(注意这里的所有代码都在内核态

中断类型码去中断向量表中找对应的程序入口地址

1.中断类型码有些是在系统本来就设定好的有些是自己设置,总之一个号对应一种中断;用一个字节来保存所以共有0~255个中断类型码可以使用;

2.中断向量表存在内存中的0000:0000~0000:03FF,这是8086固定好的;

3.程序入口地址在中断向量表中用两个字的长度来存储,因为8086有20位地址总线。高位保存程序入口地址的段地址,低位保存偏移地址,而它们分别要一个字来计算;

这里说一下:

由于8086是16位机,CPU一次能处理的数据长度是16位。而在读写内存的时候CPU要先把要访问的内存地址通过地址总线传给内存,那么CPU内部得先得出这个地址吧,但是 一次处理不了20位(地址也是数据),解决办法是用基地址+偏移地址=物理地址,这样只需要两个寄存器和一个地址加法器,做一个加法就能一次把物理地址算出来了,也就是段地址*16+偏移地址,所以可以看出来:基地址=段地址*16

4.可屏蔽中断得到中断类型码由硬件来完成(8259A),然后通过数据线把中断类型码送到CPU,CPU查找IDT、GDT/IDT得到程序入口地址,然后开始转入中断处理程序;内中断的中断类型码是在CPU内部自动产生的所以没有得到中断类型码这一步。关于8259A得到中断类型码百度一下8259A好搜百科就知道了。

5.中断响应和中断处理的过程

A.中断过程:

(1)(从中断信息中)取得中断类型码;

(2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先入栈保存);

(3)设置标志寄存器的第8位TF和第9位IF的值为0;

(4)CS和IP入栈;

(5)从内存地址为中断类型码*4+中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS

B.中断处理程序:

(1)保存用到的寄存器;

(2)处理中断;

(3)恢复用到的寄存器;

(4)iret返回

内中断、外中断中的可屏蔽中断和不可屏蔽中断只有中断过程的第一条不一样:内中断的中断类型码是CPU内部产生的,可屏蔽中断的中断类型码是通过数据总线从芯片传入CPU的,不可屏蔽中断的中断类型码固定为2不需要取中断类型码,也就是说它不需要进行第一步。


边边角角:

1.总的来说CPU每执行完一条指令就会检查有没有中断,如果有就去响应处理,但是有一些指令却和别的指令“捆绑”在一起的,比如move ss,xx后面必须紧跟move esp,xx,因为如果在改变了栈的位置后还没设置栈顶就响应中断,中断会pushf,push cs,push ip但是还没正确设置esp,会出错,所以他们之间不会响应中断,因此用单步调试的时候会看到move esp,xx的指令,因为紧跟着已经被执行了;

2.TF:陷阱标志,为程序调试设置的。当TF=1,CPU处于单步执行指令的方式;当TF=0,CPU正常执行程序(具体为什么响应中断的时候要关闭还不是很清楚);

3.IF=0入栈就是为了在执行中断处理程序的时候关闭中断,不响应中断,当然其实也可以设置为可以响应;


关于外中断:

外中断是为了响应外设对CPU的请求而设置的,那么我们就说一下CPU的功能:

1.操作数据(在内存中),进行运算;

2.控制外设

CPU通过主板上的某一些芯片控制外设,更具体的说:CPU通过向芯片上的端口读写数据控制外设,外设通过向芯片上的端口读写数据请求CPU。

其实这所谓的端口就是在这些芯片上的寄存器,用于“缓存”他们交互的数据,CPU把这些端口统一编址构成端口地址空间(范围:64K,即共可编号65536个端口)

所以主板上的各种存储器芯片构成了计算机的内存空间,主板上各种芯片的寄存器(端口)构成计算机的端口地址空间,这是两个互不侵犯的空间,但都是通过控制总线来控制,通过不同的读写指令来区分:端口的读写只能是in out


二、保护模式下的中断(32位)

1.IDT(中断描述符表)代替中断向量表,里面存的不是直接的物理地址,而是选择子和偏移,要用选择子到GDT表或IDT中找相应的段描述符然后找到段地址,如果开启了分页机制,那这个段地址和IDT中的偏移相加得到的还不是物理地址而是线性地址,还要用分页机制通过cr3找到PDE加上线性地址高10位在PDE中找到PTE首地址,然后用线性地址中间10位找到内存基地址,然后加上线性地址低12位才真正得到物理地址;

2.保护模式下的中断有了特权级的变换,这也就是用到了我们前开头说的中断处理程序都运行在内核态,这在实模式下是没有意义的因为都在内核态。有了特权级变换那么就得提到CPL、DPL、RPL,还有TSS。有特权级变换的中断:在CPU通过IDT到GDT找到处理程序段描述符后会检验CPL和DPL特权级,如果有满足变换条件就把CS,IP指向处理程序入口地址,并且根据DPL到TSS中找相应级别的SS,ESP然后切换堆栈。特权级变换条件和调用门差不多。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值