京东-优惠雷达
箱包品类日
嗨翻暑期档
随心所动,自在安睡
自营热卖

05 linux011中断

思君如痴 1年前   阅读数 117 0

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中设置的处理程序。


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: