【发布时间】: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