0

我尝试编写一个非常简单的引导代码来挂钩 INT 10,如下所示:

新整数10:

Pushf
Cli
Call [CS:old_Int10]
Iret

该代码适用于所有情况,但是当我尝试启动到 Window 时。系统挂起。我在Bochs中调试并注意到操作系统尝试切换v8086模式然后调用Int10and 使用我的新 Int10 处理程序(at address 0x97400执行失败(它没有转到导致系统挂起的处理程序,似乎保护模式下的某些映射不正确)。

如果不更改,INT10我可以进入int10 handler(原始处理程序位于address 0xC0152)。

我想念什么吗?

我已经挂钩Int15h注册新处理程序的区域e820 type = 2

更新:我做了更多调试并发现...当窗口(仅在 Windows 启动到安全模式时发生)切换到 v8086 模式时,它设置 VME(在 CR4 中)= 1,IPOL=3 并且程序跳转到 0x97400 . 不幸的是,页面映射当前将此地址映射到另一个物理地址 0x7dd2000 ......所以应用程序发疯了。地址 0xC0000 仍然映射到 0xC0000,这解释了为什么如果我们不更改 INT10,窗口可以启动。

我的问题:有什么方法可以通知 Window Boot Loader 不要重新映射地址 0x97400?

谢谢

4

1 回答 1

0

好吧,最后我解决了这个问题。

我必须将 edba 从 0x9fc00 复制到 0x97400 并将 0x40e 调整到新位置 0x97400。然后我将我的代码重新定位到 EDBA 旁边并更新 EDBA 大小。然后代码就可以运行了。

我猜 Window Boot Loader 尝试将 640K 映射到 0x7dd2000 的新位置。然后它只复制 bda(从 0 到 4ff)和 ebda(从 0x9fc00 到 0xa000)到新位置……所以重新定位 edba 并更新 edba 的大小就可以了。

于 2016-11-02T15:02:13.777 回答