中断分类和Gate



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 来自cup之外的叫中断(Interrupt):

;           *可屏蔽中断(IRQs)

;           *不可屏蔽中断(NMI)

;      可屏蔽中断(IRQs) 可以由cli/sti 指令控制.

;      两者都可以被cpu外的硬件所屏蔽.

; 来自cup内部的叫异常(Exceptions):

;    **CUP 侦测到的异常:

;        *故障(Fault): 在当前指令执行前发生. 如除0, 非法操作码,page fault.

;        *陷阱(Trap): 在执行当前指令后发生. 程序指令int 产生的异常都是陷阱.

;        *Abort: 异常位置不可确定.如 double fault, coprocessor segment overrun.

;    **程序主动产生的异常 :

;        INT instruction

;        INT3 instruction

;        INTO instruction

;        BOUND instruction

;*************************************

;Intel 保留的32 个中断/异常:

;|Number | interrupt/exception|     notes

;+-----+----------------------+------------------------------------------------

;|  0  |   divide  error      | could be overflow as well as zero denominator

;+-----+----------------------+------------------------------------------------

;|  1  |   debug exception    |

;+-----+----------------------+-------------------------------------------------
;|  2  |    NMI               |

;+-----+----------------------+-------------------------------------------------

;|  3  |   INT3 instruction   | debugger breakpoint

;+-----+----------------------+-------------------------------------------------

;|  4  |   INTO instruction   | detected overflow 

;+-----+----------------------+-------------------------------------------------

;|  5  |  BOUND instruction   | detected overrange 

;+-----+----------------------+-------------------------------------------------

;|  6  |  invalid instruction |

;+-----+----------------------+-------------------------------------------------

;|     |   opcode             |

;+-----+----------------------+-------------------------------------------------

;|  7  |   no coprocessor     | ESC, WAIT instructions

;+-----+----------------------+-------------------------------------------------

;|  8  |   double fault       | possible for 386+ in real mode

;|     |                      |  if INT vector exceeds IDT limit

;+-----+----------------------+-------------------------------------------------

;|  9  |  coprocessor segment | not in real mode

;|     |   overrun            | 

;+-----+----------------------+-------------------------------------------------

;|  10 |   invalid task state |  not in real mode

;|     |   segment (TSS)      |

;+-----+----------------------+-------------------------------------------------

;|  11 |  segment not present |  not in real mode

;+-----+----------------------+-------------------------------------------------

;|  12 |   stack fault        |  possible in real mode if stack access

;|     |                      |  straddles offset 0 or FFFFh

;+-----+----------------------+-------------------------------------------------

;|  13 |   general protection | possible in real mode if non-stack memory access
straddles

;|     |    fault (GPF)       | 0 or FFFFh, or if instruction is longer than 15
bytes,

;|     |                      | or if a 32-bit address greater than FFFFh is used

;+-----+----------------------+-------------------------------------------------

;|  14 |   page fault         |  not in real mode

;+-----+----------------------+-------------------------------------------------

;|  15 |   (reserved) 

;+-----+----------------------+-------------------------------------------------

;|  16 |   coprocessor error  |  ESC, WAIT instructions

;+-----+----------------------+-------------------------------------------------

;|  17 |   alignment check    |  not in real mode; 486+ only

;+-----+----------------------+-------------------------------------------------

;|  18 |   machine check      |  Pentium+ only

;+-----+----------------------+-------------------------------------------------

;|19-31|  (reserved)          |

;+-----+----------------------+------------------------------------------------

;*****************************************

; interrupt/exception 发生后CPU 的动作

; 1. 如果伴随 pmode 特权级切换, CPU 从当前的TSS 中加载 SS (E)SP .

; 2. 如果伴随 pmode 特权级切换, 原来的 SS 和 (E)SP 入新堆栈.

; 3. CS, (E)IP, (E)FLAGS 入新栈. 一些异常可能还把一个错误码入新栈.

; 4. 如果通过一个中断门,CPU 清 IF . 

; 5. CPU 做一个 far jump; 从门中加载 CS and (E)IP .

;

; 中断/异常发生后可能形成10 种栈布局. 3 个16-bit 保护模式; 2个virtual 8086 模式.

; 还有一个16 bit 实模式. 对我们比较有意义的4个32位保护模式下的栈格式是:

;+--------------------------------+----------------------------------+

;|          无特权级切换          |           伴随特权级切换         |

;+----------------+---------------+-----------------+----------------+

;|  <- 32 bits -> | <- 32 bits -> |  <- 32 bits ->  |<- 32 bits
->   |

;|    ... ...     |   ... ...     |    ... ...      |   ...  ...     |

;|    ... ...     |   ... ...     |    ... ...      |   ... user SS  |

;|    ... ...     |   ... ...     |    ... user SS  |    user ESP    |

;|    ... ...     |   EFLAGS      |    user ESP     |    EFLAGS      |

;|    EFLAGS      |   ... CS      |     EFLAGS      |    ... CS      |

;|    ... CS      |    EIP        |    ... CS       |     EIP        |

;|      EIP       |  error code   |      EIP        |   error code   |

;+----------------+---------------+-----------------+----------------+

;|    无错误码    |   有错误码    |     无错误码    |   有错误码     |

;+----------------+---------------+-----------------+----------------+

;****************************************************************

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;中断门描述符格式 

;+31-----------------16|15 |14 13|12------8|7----------0-+ 

;|   Offset 31..16     | P   DPL   0 D 110   0000 0000   | 1 dword

;+---------------------+-------------------+-------------+

;+31-----------------16|15-----------------------------0-+

;|      Selector       |   Offset 15..0                  | 0 dword

;+---------------------+---------------------------------+

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Trap Gate

;+31-----------------16|15 |14 13|12------8|7----------0-+ 

;|   Offset 31..16     | P   DPL   0 D 111   0000 0000   | 1 dword

;+---------------------+-------------------+-------------+

;+31-----------------16|15-----------------------------0-+

;|      Selector       |   Offset 15..0                  | 0 dword

;+---------------------+---------------------------------+ align 3

;***********************

;DPL-------Descriptor Privilege Level

;Offset----Offset to procedure entry point

;P---------Segment Present flag

;Selector--Segment Selector for destination code segment

;D---------Size :1 = 32 bits; 0 = 16 bits

;***********************

; 1 dword 8---15bits 的典型值

; Interupt Gate (clear IF):8Eh or 0EEh (kernel/user)(32 bit)(用于中断或异常)

; Trap Gate(keep IF):      8Fh or 0EFh (kernel/user)(32 bit)(用于trap ?)

;***********************

;GATE     STRUC      ;门结构类型定义

;    OFFSETL  DW      0  ;32位偏移的低16位

;    SELECTOR DW      0  ;选择子

;    Reserve  DB      0 

;    GTYPE    DB      0  ;类型

;    OFFSETH  DW      0  ;32位偏移的高16位

;    GATE     ENDS

 

<think>嗯,用户想了解操作系统如何实现中断的实现细节。从对话历史看,用户已经查阅了三篇关于中断机制的资料,现在需要更技术性的实现流程说明。 用户可能正在学习操作系统内核开发或准备相关考试,需要清晰的步骤拆解。ta特意强调“实现”而非概念,说明需要从代码层面理解中断机制。考虑到中断涉及硬件交互,准备在回复中补充硬件层面的触发细节。 之前引用中提到了中断分类(内/外中断)、作用(多任务/设备驱动等),但没说明具体实现步骤。需要重点展开: 1 硬件触发部分要解释CPU如何接收中断信号 2 软件响应部分需说明中断描述符表(IDT)的建立过程 3 状态保存环节要强调寄存器压栈的必要性 4 提到中断嵌套时需注意优先级问题 用户提供的引用[3]关于内外中断分类很清晰,可以延续这个分类框架。但引用[1]提到的“时间片分配”属于中断的应用场景而非实现机制,可能需要规避。另外中断处理程序(ISR)的编写要点需要补充,比如不可阻塞、快速执行等工程实践。 考虑到用户可能接触过汇编,准备适当引入关键指令(如x86的int/iret),但避免过度深入不同架构差异。最后用打印机中断的完整案例串联所有步骤,帮助用户建立直观认知。 </think>操作系统实现中断机制是一个硬件与软件协同工作的过程,主要分为以下关键步骤: --- ### **1. 中断触发与硬件响应⚡** - **硬件检测**:CPU在执行指令时持续监测中断请求信号(如时钟中断、I/O设备中断)。 - **中断类型识别**:CPU根据中断源生成**中断向量号**(如除零错误为0号,系统调用为0x80)。 - **上下文保存**:CPU自动将当前程序状态(包括程序计数器PC、状态寄存器PSW等)压入内核栈📚。 --- ### **2. 软件介入:中断描述符表(IDT)🔍** 操作系统在启动时初始化IDT(中断描述符表): ```c // 示例:Linux内核初始化IDT片段 void init_idt() { set_trap_gate(0, ÷_error); // 设置除零异常处理函数 set_system_gate(0x80, &system_call); // 系统调用入口 set_irq_gate(2, &keyboard_interrupt); // 键盘中断处理 } ``` - **IDT作用**:存储中断向量号与对应处理函数的映射(类似函数指针表📋)。 - **特权级检查**:CPU根据IDT条目中的权限位判断是否允许切换至内核态🔒。 --- ### **3. 中断处理流程🔧** ```mermaid graph LR A[中断触发] --> B{硬件响应} B --> C[保存上下文到内核栈] C --> D[查询IDT获取处理函数] D --> E[执行中断服务例程 ISR] E --> F[恢复上下文] F --> G[返回原程序] ``` - **中断服务例程(ISR)**: - 保存所有寄存器状态(如eax, ebx等)。 - 执行具体操作(如读取键盘缓冲区⌨️、更新进程时间片⏱️)。 - 通过`iret`指令恢复现场并返回。 --- ### **4. 关键机制详解🔐** 1. **中断嵌套**: - 高优先级中断可抢占低优先级ISR,通过**中断屏蔽字**控制嵌套深度。 - 示例:定时器中断 > 磁盘中断 > 网络中断。 2. **中断与进程调度**: - 时钟中断触发调度器`schedule()`,实现多任务切换: ```c // Linux时钟中断处理简化逻辑 void timer_isr() { update_process_times(); // 更新进程时间片 if (--current->counter <= 0) schedule(); // 触发进程调度 } ``` 3. **系统调用实现**: - 用户态执行`int 0x80`或`syscall`指令 → 陷入内核 → 根据EAX寄存器调用对应系统函数。 --- ### **5. 中断优化技术🚀** - **中断合并**:网卡接收多个数据包后触发一次中断(如NAPI机制)。 - **软中断(SoftIRQ)**:将非紧急操作(如网络包处理)推迟到中断后半段执行。 - **线程化中断**:将ISR移至内核线程执行,减少关中断时间。 --- ### **案例:打印机中断完整流程🖨️** 1. 打印机完成打印 → 发送IRQ信号到中断控制器。 2. CPU暂停当前进程 → 跳转至IRQ对应的ISR。 3. ISR读取打印机状态 → 唤醒等待打印的进程。 4. 调用`iret`返回用户程序。 --- > **中断机制的本质**:操作系统通过IDT建立硬件事件到软件处理的桥梁🌉,结合栈操作保存/恢复现场,实现对外部事件的即时响应与系统资源的精细管控[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值