05 linux011中断

Posted 资质平庸的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05 linux011中断相关的知识,希望对你有一定的参考价值。

1 中断源

此文将触发 CPU 引用 IDT 描述符的方式总结为两种。

[1] CPU执行 int 一类指令。

[2] CPU在完成某条指令的执行后, 接收/检测到某中断(或异常)信号时。

2 中断过程

CPU 执行 int 指令或检测到中断信号时具体引用哪一个 IDT 描述符呢。

[1] CPU执行 “int n” 指令时将其操作数 n 用作引用IDT描述符的索引, 即引用 IDT[n]。

[2] IDT[0…16]是 Intel 在硬件层面为 CPU 分配的 IDT描述符, 即当CPU检测到这17个中断中的一个发生时便自动引用其对应的IDT描述符。

IDT[0] ... 除法溢出
IDT[1] ... 调试(标志寄存器TF=1时)

其余 IDT 描述符可由编程指定给外设(I/O设备)中断。在linux0.11的保护模式程序中,编程为 8259A 分配了 IDT[20h…2fh]。如键盘中断的IDT描述符为IDT[21h], 键盘输入发生键盘中断时(键盘I/O)会向CPU发出中断信号, 该中断信号包含引用IDT描述符的索引21h(俗称中断号/码), CPU从而引用IDT[21h]。

CPU在跳转执行IDT描述符中的子程序前, 会自动在ss:esp维护的栈内存中备份中断发生处的信息(中断现场保护), 供中断处理程序返回(若有必要)以继续执行中断发生处的后续程序。

中断主要过程可参考09 系统调用开销分析

3 特权级(简)

通过int n指令跳转执行IDT[n]中设置的处理程序时需满足CPL <= IDT[n].DPL, CPL >= IDT[n].GDT.DPL。 由于所有的中断处理函数都在内核可执行段中(DPL=0), 所以在CPL > 0的程序中不能通过int指令跳转执行在set_trap_gate中设置的处理程序。

以上是关于05 linux011中断的主要内容,如果未能解决你的问题,请参考以下文章

07 linux011字符设备管理

07 linux011字符设备管理

06 linux011块设备管理

06 linux011块设备管理

Linux性能优化从入门到实战:05 CPU篇:硬中断软中断

08 linux011进程调度