我一直在学习使用 Bochs 的 BrokenThorn OSDev 教程,它运行良好(vga-info 获取,MemoryDump 是我在实模式下编写的,并且还有一些 320*200*256 的图形)。然而,在 Demo4 中进入保护模式 (PM)(内核加载为 0x100000 (1Mb))后,我注意到我无法写入高内存(例如 0xD0000000)我的 MemDump 运行良好,因为我使用 0x7c00 对其进行了测试,我的引导加载程序已加载并且引导加载程序的消息是用 MemDump 打印的,我还写了几个 0x66 到 7c00。0x100000 处的内核代码也被正确转储。
这是从 0xD0000000 (Intel-syntax, Nasm) 写入 0x66 的代码:
mov edi, 0xD0000000
mov BYTE [edi], 0x66 (.Next; this is at the beginning of the line)
inc edi
cmp edi, 0xD0000010
jnz .Next
在 ClrScr32 和 MemDump 从 0xB8000 打印之后,我将它添加到 Stage3.asm
和 MemDump:
mov esi, 0xD0000000
mov ecx, 24 ; prints 24 lines (16 bytes per line)
call MemDump
总是从 0xD0000000 开始显示 FF,所以我无法将数据写入高端内存。GDT 设置正确(我没有更改 BrokenThorn 给出的那个),r/w 位为 1,段限制为设置粒度位的最大值。
如果你们中的任何人遇到此问题和/或有解决方案,请不要犹豫与我分享。
最好的问候,抢
(Demo4 可以在:教程 11,内核准备,第 2 部分找到) http://www.brokenthorn.com/Resources/OSDevIndex.html