Operating system 高内存can';不能在保护模式下写入

Operating system 高内存can';不能在保护模式下写入,operating-system,kernel,Operating System,Kernel,我一直在跟随Bochs的BrokenThorn OSDev教程,它工作得很好(vga信息采集,MemoryDump是我在real模式下编写的,还有一些320*200*256的图形)。 然而,在Demo4中进入保护模式(PM)(内核以0x100000(1Mb)加载)后,我注意到我无法写入高内存(例如0xD0000000) 我的MemDump工作得很好,因为我用0x7c00测试了它,其中加载了我的引导加载程序,引导加载程序的消息用MemDump打印,我还向7c00写入了一些0x66s。0x10000

我一直在跟随Bochs的BrokenThorn OSDev教程,它工作得很好(vga信息采集,MemoryDump是我在real模式下编写的,还有一些320*200*256的图形)。 然而,在Demo4中进入保护模式(PM)(内核以0x100000(1Mb)加载)后,我注意到我无法写入高内存(例如0xD0000000) 我的MemDump工作得很好,因为我用0x7c00测试了它,其中加载了我的引导加载程序,引导加载程序的消息用MemDump打印,我还向7c00写入了一些0x66s。0x100000处的内核代码也被正确转储

这是从0xD0000000(英特尔语法,Nasm)写入0x66的代码:

我在从0xB8000打印ClrScr32和MemDump之后立即将其添加到Stage3.asm

和MemDump:

    mov esi, 0xD0000000
    mov ecx, 24     ; prints 24 lines (16 bytes per line)
    call MemDump
始终从0xD0000000显示FF,因此我无法将数据写入高内存。 GDT设置正确(我没有更改BrokenThorn给出的GDT),r/w位为1,段限制为设置粒度位后的最大值

如果你们中有人遇到这个问题和/或有解决方案,请毫不犹豫地与我分享

致以最良好的祝愿, 抢劫

(演示4可以在:教程11,准备内核,第2部分中找到)

您运行的是什么操作系统?它与演示不同吗?我运行的是Debian Linux,但操作系统的开发是通过Bochs完成的。BrokenThorn使用Windows。是否有可写入的内存?从我在教程中看到的情况来看,您可能没有使用分页,这意味着您只能在虚拟机中的RAM超过3.25 GB时才能写入该地址。我相信bochs默认使用32或64 MB,因此您正在尝试写入不存在的内容。您一定是对的。我刚用0x200000试过。我将几个字节写入0x200000,它们被正确转储。这一定是Bochs没有你说的那么多记忆。根据vgainfo,vga帧缓冲区来自E0000(实数模式下为E000:0000),而非F0000000。可能是因为这个。谢谢很抱歉这么大惊小怪。
    mov esi, 0xD0000000
    mov ecx, 24     ; prints 24 lines (16 bytes per line)
    call MemDump