在32位保护模式下启用A20线路的问题

问题描述 投票:1回答:1

我编写了一个简单的引导程序,在其中我已从实模式切换到保护模式。我要启用A20地址线。这是我的代码(不正确):

EnableA20:
        .try0:
                call .checkenabled
                cmp eax,0
                jne .done
        .fail:
                jmp $

        .checkenabled:
                push ebx
                mov eax,0x1234
                mov [0x10],eax
                mov ebx,[0x100010]
                sub eax,ebx
                pop ebx
                ret

.done:

它显示我的地址行默认处于启用状态...可以吗?

我哪里出错了?我使用的方法是将0x1234写入地址0x10,并从地址0x100010读取值。如果我写的值与地址中存在的值相同(由于要换行),我知道不应启用该行。

我正在使用qemu作为仿真器:

qemu-system-i386 myos.bin
assembly x86 bootloader osdev
1个回答
0
投票

根据osdev wiki,以保护模式启用A20线路的方法从一个芯片组到另一个芯片组会有很大不同。在某些情况下,甚至可以在引导时通过bios / bootrom启用它。因此,通常的做法是首先编写一个例程,该例程可以检查是否执行了A20线路(通过将数据写入可访问的ram区域并查找要在更高的ram地址中进行镜像的数据),并且您的方法似乎是正确的据我所知。仅当bios / bootrom尚未启用时,您才尝试其他方法。

当您的计算机启动时,A20门总是被禁用,但是某些BIOS确实为您启用了它,一些高级内存管理器(HIMEM.SYS)还是引导加载程序(GRUB)。进行此检查后,您可以尝试全部一对一地使它失效的方法,看看哪个对它有用系统

推荐使用的步骤是:

因为有几种不同的方法可能会或可能不会支持,并且因为其中一些会在某些计算机上引起问题;推荐的方法是尝试所有这些,直到其中一个起作用“风险最小的顺序”。本质上:

Test if A20 is already enabled - if it is you don't need to do anything at all
Try the BIOS function. Ignore the returned status.
Test if A20 is enabled (to see if the BIOS function actually worked or not)
Try the keyboard controller method.
Test if A20 is enabled in a loop with a time-out (as the keyboard controller method may work slowly)
Try the Fast A20 method last
Test if A20 is enabled in a loop with a time-out (as the fast A20 method may work slowly)
If none of the above worked, give up

有关更多信息,请参见osdev Wiki上的A20行页面:https://wiki.osdev.org/A20

© www.soinside.com 2019 - 2024. All rights reserved.