Linux从头学07:【中断】那么重要,它的本质到底是什么?
扫描二维码
随时随地手机看文章
作 者:道哥,10 年的嵌入式开发老兵。专注于:C/C 、Linux操作系统、应用程序设计、物联网、单片机和嵌入式开发等领域。公众号回复【书籍】,获取 Linux、嵌入式领域经典书籍。
转 载:欢迎转载文章,转载需注明出处。
-
中断向量与中断描述符
-
中断的分类
-
内部中断
-
外部中断
-
中断号
-
中断向量和中断处理程序
-
中断向量的本质
-
中断处理程序的安装
-
中断现场的保护和恢复
-
总结:中断的本质
上下文环境,就是描述当前正在执行的程序相关的静态信息,比如:有哪些代码段,栈空间在哪里,进程描述信息在什么位置,当前执行到哪一条指令等等。如果我们没有一个全局的视角,在同一个上下文环境中来对比不同的文章,就会让自己的理解和认识越来越蒙圈。
中断向量与中断描述符
中断向量这个词很时髦,也很神秘!
本文是实模式下的最后一篇文章,下一篇文章将会进入保护模式。那么,中断向量就是工作在实模式下的,处理器通过中断号和中断向量,来定位到相应的中断处理程序。
中断的分类
在x86系统中,中断的分类如下:
内部中断
所谓的内部中断,是在CPU内部产生并进行处理的。比如:
对于内部中断,有时候也称之为异常。
- CPU 遇到一条除以 0 的指令时,将产生 0 号中断,并调用相应的中断处理程序;
- CPU 遇到一条不存在的非法指令时,将产生 6 号中断,并调用相应的中断处理程序;
外部中断
x86CPU上有2个中断引脚:INT和INTR,分别对应:不可屏蔽中断和可屏蔽中断。
这样的话,两片8259a芯片就可以向CPU提供15个中断信号了,比如:鼠标、键盘、串口、硬盘等等外设。
- 主片的输出引脚 INT 连接到 CPU 的 INTR 引脚上;
- 从片的输出引脚 INT 连接到主片的引脚 2 上;
1. 8259a 之所以称作可编程,是因为它的内部有相关的寄存器。另外,对于外部可屏蔽中断,有2层的屏蔽机制:2. 可以通过指定的端口号,对这些寄存器进行设置,让 8 根 IRQ 中断线上的信号,在送到 CPU 时,对应不同的中断号。
- 在 8259 芯片中,有中断屏蔽寄存器,可以对 IRQ0 ~ IRQ7 输入引脚进行屏蔽;
- 在 CPU 内部,也有一个标志寄存器,可以对某一类中断信号进行屏蔽;
中断号
在x86处理器中,一共支持256个中断,每一个中断都分配了一个中断号,从0到255。
1. 系统定时器中断 IRQ0,分配的就是 32 号中断;我们来分别看一下内部中断和外部中断相关的中断号:2. Linux 的系统调用,分配的就是 128 号中断;
中断向量和中断处理程序
当一个中断发生的时候,CPU获取到该中断对应的中断号,下一步就是要确定调用哪一个函数来处理这个中断,这个函数就称作中断服务程序(Interrupt Service Routine,ISR),有时候也称作中断处理程序、中断处理函数,本质都一样。
中断向量的本质
在8086中,一个中断向量,就是一个 段地址:中断处理函数偏移量 这样的一对数据,通过这个数据,就可以定位到内存中指定位置的那个中断处理函数。
1. 由于 Linux 系统是运行在保护模式,在这个模式下,当发生中断时,是通过中断描述符来查找中断处理函数的。2. 每一个中断描述符,描述了一个中断处理函数所在段的选择子和偏移量,本质上也是用来查找一个中断处理函数。
中断处理程序的安装
既然通过中断向量,找到了中断处理程序,那么这些中断处理程序都是谁放在内存中的呢?
此时,如果发生了该中断,你所提供的函数就作为中断处理函数被执行了。
- 在代码中,写一个普通函数;
- 把这个函数的指令码,搬运到内存中的某一个位置;
- 把这个位置(段地址:偏移量),作为一个中断向量,设置到中断向量表中;
中断现场的保护和恢复
当一个中断发生的时候,肯定有一个正在执行的程序被打断。
总结:中断的本质
从功能的角度看,中断有2个作用:
关于第2点,以后在介绍到Linux中的int 0x80中断就非常清楚了,也就是通过中断,让应用层的程序有机会进入到系统代码中去执行。
- 提供执行异步序列的机制;
- 给应用程序提供进入系统层的入口;
------ End ------
关于中断的相关内容,还有很多需要学习,任重而道远!