“中断挂钩”是什么意思?

时间:2016-05-05 17:54:03

标签: x86 operating-system interrupt terminology

我正在阅读PnP BIOS specification并偶然发现以下段落:

  

主动监控INT 19h引导向量

     

当前的系统BIOS   架构允许选项ROM无差别地挂接INT 19h。通过   主动监控INT 19h的控制,系统BIOS可能重新获得   控制Bootstrap进程以确保操作系统   从适当的设备加载并以适当的方式。

在第3行,提到了“挂钩”中断的可能性。据我所知,它意味着监视中断的发布,例如在每个ISR中调用一个特殊的通知函数,让操作系统跟踪触发的中断。这是对的吗? 这是什么意思?

2 个答案:

答案 0 :(得分:2)

当在实模式下触发中断时,CPU将执行转移到该中断的处理程序,该处理在Interrupt Vector Table中指定。

在此上下文中挂接中断意味着更改中断向量表中条目@IBOutlet var Webview: UIWebView! let url = NSURL(string: "https://account.live.com/") let request = NSURLRequest(URL: url!) Webview.loadRequest(request) 处的地址以指向其选择的另一个地址。然后,当触发中断19h时,它将从该地址开始执行自己的例程,这可能还会在返回之前将控制权转移回原始的19h中断处理程序。

假设中断处理程序位于RAM中,另一种挂钩方法是在处理程序中放置内联挂钩以进行中断19h。也就是说,可以单独留下中断处理程序的地址,但是将处理程序中的一条指令替换为19h(或jmp)到它们自己的例程。在这方面还不清楚他们是否也会监视这种类型的挂钩。

编辑:浏览文档后,看来第一种挂钩方式就是他们所说的。

  

...如果系统BIOS知道IPL设备,那么   确保中断19h仍然由系统BIOS控制。 如果没有,重新捕获中断19h并保存矢量 ...

     

...如果操作系统无法加载和以前的ISA选项ROM   控制中断19h向量,然后将中断19h向量恢复到ISA选项ROM 并重新执行中断19h引导加载程序......

因此,基本上在启动过程的特定部分,他们检查选项ROM是否修改了中断call的处理程序。如果它被修改,它们会保存新处理程序的地址(它们可能选择稍后运行)并将原始处理程序放回IVT。

答案 1 :(得分:2)

是的,"挂钩"表示在中断触发时运行代码,但跳转到函数完成时替换的处理程序。因此,您没有完全接管中断,而是将您的功能添加到处理程序链的头部。

想象一下IDT是一个全局函数指针数组。在C中,它会像:

extern void (*IDT[256])(void );

static void (*old_handler)(void);
void my_handler(void) {
    // do stuff ..., then:
    old_handler();
}  // tail-call optimized to a jmp

void install_handler(int irq) {
    old_handler = IDT[irq];
    IDT[irq] = my_handler;
}
void uninstall_handler(int irq) {   // Don't forget this part when you unload your code
    IDT[irq] = old_handler;
}

这个compiles to恰好是您用来挂钩真实IDT的代码。