我正在阅读PnP BIOS规范,无意中发现了以下段落:
主动监视int19h引导向量 当前的系统BIOS体系结构允许选项ROM不加区分地挂起INT 19h。通过主动监视INT 19h的控制,系统BIOS可以重新控制引导进程,以确保操作系统从适当的设备并以适当的方式加载。
在第3行中,提到了“钩子”中断的可能性。据我所知,它意味着监视中断的发出,比如在每个ISR中调用一个特殊的通知函数,让操作系统跟踪被触发的中断。对吗?
什么意思?
发布于 2016-05-05 21:31:51
当中断以实模式触发时,CPU将执行传递给该中断的处理程序,该中断是在中断向量表中指定的。
在这种上下文中挂接中断意味着更改中断向量表中条目19h的地址,以指向他们选择的另一个地址。然后,当中断19h被触发时,它将从该地址开始执行自己的例程,这可能还会在返回之前将控制权传输回原始的19h中断处理程序。
假设中断处理程序位于RAM中,另一种挂钩方法是在处理程序中放置一个内联钩子,用于中断19h。也就是说,可以将中断处理程序的地址单独保留,但将处理程序中的一个指令替换为jmp (或call)到他们自己的例程中。在这种情况下,不清楚他们是否也监测这类勾结。
编辑:浏览完文档后,看起来第一种挂钩方式就是他们所说的。
..。如果IPL设备为系统BIOS所知,则确保中断19h仍由系统BIOS控制。如果不是,恢复中断19h并保存向量. ..。如果操作系统无法加载并且以前的ISA选项ROM控制了中断19h向量,那么将中断19h向量恢复到ISA选项ROM并重新执行中断19h引导加载程序.
因此,基本上在引导过程的一个特定部分,他们检查一个选项ROM是否修改了中断19h的处理程序。如果对其进行了修改,它们将保存新处理程序的地址(可以选择稍后运行),并将原始处理程序返回到IVT中。
发布于 2016-05-05 22:20:22
是的,“挂钩”意味着在中断触发时让您的代码运行,但在函数完成后跳到您替换的处理程序。因此,您没有完全接管中断,而是将函数添加到处理程序链的头上。
假设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的代码类型。
https://stackoverflow.com/questions/37057157
复制相似问题