我尝试编写一个非常简单的引导代码,用于挂接INT 10,如下所示:
New_int10:
Pushf
Cli
Call [CS:old_Int10]
Iret
代码适用于所有情况,但是当我尝试启动到Window时。系统挂起。我在 Bochs 中调试并注意操作系统尝试切换到v8086
模式然后调用Int10
和我的新Int10处理程序(在{{ 1}})执行失败(它不会导致导致系统挂起的处理程序,看起来保护模式下的某些映射不正确)。
如果不更改address 0x97400
,我可以进入INT10
(int10 handler
处的原始处理程序)。
我错过了什么吗?
我已经挂钩address 0xC0152
以使用Int15h
更新:我做了更多调试并找出...当Window(它只在Windows启动到安全模式时发生)切换到v8086模式时,它设置VME(在CR4中)= 1 ,IPOL = 3,程序跳转到0x97400。不幸的是,页面映射当前将此地址映射到另一个物理地址0x7dd2000 ...因此应用程序变得疯狂。地址0xC0000仍然映射到0xC0000,这解释了为什么如果我们不更改INT10,窗口可以启动。
我的问题:有没有办法通知Window Boot Loader不重映射地址0x97400?
由于
答案 0 :(得分:0)
好吧,最后我解决了这个问题。
我必须将edba从0x9fc00复制到0x97400并将0x40e调整到新位置0x97400。然后我将代码重新定位到EDBA旁边并更新EDBA大小。然后代码可以运行。
我猜Window Boot Loader尝试将640K映射到一个新的位置,即0x7dd2000。然后它只复制bda(从0到4ff)和ebda(从0x9fc00到0xa000)到新位置......所以重新定位edba并更新edba的大小。