我尝试编写一个非常简单的引导代码来挂钩 INT 10,如下所示:
新整数10:
Pushf
Cli
Call [CS:old_Int10]
Iret
该代码适用于所有情况,但是当我尝试启动到 Window 时。系统挂起。我在Bochs中调试并注意到操作系统尝试切换到v8086
模式然后调用Int10
and 使用我的新 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?
谢谢