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

5
我正在阅读PnP BIOS规范,并偶然发现以下段落:
“积极监视INT 19h引导向量”
当前的系统BIOS 结构允许选项ROM无差别地钩取INT 19h。通过 积极监控对INT 19h的控制,系统BIOS可以重新获得 引导过程的控制权,以确保操作系统 从正确的设备和正确的方式加载。
在第3行中提到了“hook”中断的可能性。据我所知,这意味着监视中断的发出,例如在每个ISR中调用特殊的通知函数,以让操作系统跟踪已触发的中断。这是正确的吗? 它是什么意思?

https://en.wikipedia.org/wiki/Option_ROM#SCSI 我在维基百科上添加了一些关于它的内容。 - Lewis Kelsey
2个回答

4
当实模式下触发中断时,CPU会将执行权转移到该中断的处理程序上,该处理程序在中断向量表中指定。
在这种情况下挂钩一个中断意味着更改中断向量表中入口19h的地址以指向他们所选择的另一个地址。然后,当触发中断19h时,它将执行他们自己的例程,从该地址开始,这很可能还会在返回之前将控制权传回原始的19h中断处理程序。
假设中断处理程序位于RAM中,则挂钩的另一种方法是在中断19h的处理程序中放置内联挂钩。也就是说,可以保留中断处理程序的地址,但用jmp(或call)替换处理程序中的一条指令,以调用他们自己的例程。在这种情况下不清楚是否还会监视此类挂钩。

编辑:快速浏览了一下文档,似乎他们谈论的是第一种钩子方式。

... 如果系统 BIOS 知道 IPL 设备,则确保中断 19h 仍由系统 BIOS 控制。如果不是这样,请重新捕获中断 19h 并保存向量...

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

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


4
是的,“hooking”意味着当中断触发时运行您的代码,但是当您的函数完成后跳转到替换的处理程序。因此,您没有完全接管中断,而是将您的函数添加到处理程序链的头部。
将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;
}

这个编译器会生成与真实IDT挂钩所需的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接