首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“插嘴”是什么意思?

“插嘴”是什么意思?
EN

Stack Overflow用户
提问于 2016-05-05 17:54:03
回答 2查看 3.8K关注 0票数 5

我正在阅读PnP BIOS规范,无意中发现了以下段落:

主动监视int19h引导向量 当前的系统BIOS体系结构允许选项ROM不加区分地挂起INT 19h。通过主动监视INT 19h的控制,系统BIOS可以重新控制引导进程,以确保操作系统从适当的设备并以适当的方式加载。

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

什么意思?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中。

票数 4
EN

Stack Overflow用户

发布于 2016-05-05 22:20:22

是的,“挂钩”意味着在中断触发时让您的代码运行,但在函数完成后跳到您替换的处理程序。因此,您没有完全接管中断,而是将函数添加到处理程序链的头上。

假设IDT是一个函数指针的全局数组。在C中,它就像:

代码语言:javascript
复制
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的代码类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37057157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档