【问题标题】:Problems enabling A20 line in 32 bit protected mode在 32 位保护模式下启用 A20 线路的问题
【发布时间】:2020-04-27 04:56:24
【问题描述】:

我编写了一个简单的引导加载程序,在其中我已经从真实模式切换到保护模式。 我想启用 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

编辑:似乎默认情况下启用了 A20。但是,如果我尝试这样做:

       .try1:  ;Using keyboard controller to enable A20
                mov al,0xdd
                out 0x64,al
                call .checkenabled
                cmp eax,0
                jne .done

失败了!我读过将 0xdd 移动到端口 0x64 会启用 A20,但不会禁用它。这里有什么问题?

【问题讨论】:

  • 为什么你认为这应该[与 qemu 或其他方式一起使用]?根据快速浏览,没有命令0xdd。 AFAIK,至少 bare,您应该将0xd1 写入端口0x64(所以接下来的事情转到控制器输出端口),然后将您想要的值写入0x60(所以为 A20 启用位 1,启用位 0,这样您就不会挂起系统,依此类推;本质上,您可能只想启用位 1 而别管其他人)

标签: assembly x86 bootloader osdev


【解决方案1】:

根据 osdev wiki,在保护模式下启用 A20 线路的方法因芯片组而异。在某些情况下,它甚至可以在启动时通过 bios/bootrom 启用。因此,通常的做法是首先编写一个例程来检查 A20 线是否已启用(通过将数据写入可访问的 ram 区域并查找要在更高 ram 地址中镜像的数据),并且您的方法似乎是正确的据我所知。只有在 bios/bootrom 没有启用它时,你才尝试其他方法。

当您的 PC 启动时,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

【讨论】:

  • 那么,就我而言,看起来qemu使用的BIOS已经为我启用了A20??
  • @Suraaj K S 那是我的猜测,快速浏览一下 qemu 源代码,他们有几个 bioses,但最常见的似乎是 seabios。当我查看 sea bios 的源代码时,我发现了一个启用 a20 的功能
  • 实际上,在 QEMU 中,模拟器本身启用了 A20,所以即使我的 derpy "bios" 也启用了 a20
猜你喜欢
  • 2016-02-22
  • 2016-11-21
  • 2018-11-28
  • 2021-10-12
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多