IDT 是一个中断描述符表,从抽象的角度来看,它包含类似这样的内容,前 18 个中断由处理器保留,接下来的 18 个由 Intel 保留,用于将来验证芯片的架构......
中断处理程序
0 除以零处理程序
1 个调试处理程序
…………
13 general_exception_handler
14 page_fault_handler
…………
18 machine_check_handler
在这种情况下,处理程序是玩具内核的一部分,每个处理程序都是在启动时设置的,在加载用户空间代码之前。(BIOS 是 16 位代码,也就是实模式代码),内核设置处理程序,切换到 32 位保护模式,当发出任何中断时,根据中断号执行相应的处理程序。例如,如果产生了中断 14,内核将执行 a page_fault_handler
,检查页面是否脏并驻留在磁盘上,然后将该页面加载到内存中,修复地址并清除脏位,执行IRET
中断返回指令以继续,清除标志....
这是 IDT 工作原理的抽象视图……幕后发生了更复杂的事情……取决于内存管理的体系结构和类型,例如分页/平面/保护/虚拟模式寻址方案……
在此处查看英特尔文档,该文档对英特尔编程提供了出色而全面的视图...
编辑:
回到 DOS 的旧时代(这是 16 位代码,不是很好,完全受内存保护),可以将中断处理程序重新路由到您自己的处理程序,从而覆盖原始 IDT,例如这种中断, 中断 9 是键盘中断(在此上下文中的 BIOS 中断),使用getvect(...)
andsetvect(...)
调用,您还可以处理一些(不是所有的处理器中断,特别是 IDT 0 用于除以零)......尽管那些 BIOS 中断它们在外观上与处理器中断非常相似,它们有一个共同的特征,两者都有中断向量表(正如当时所知)。由于 BIOS 中断重新路由到 TSR 的处理程序,这就是 TSR(终止驻留)程序能够在 DOS 中保持重入的方式......