【发布时间】:2020-05-31 14:50:44
【问题描述】:
我正在构建一个用于学习目的的简单操作系统,并且我(目前;我之前遵循了不同的教程并自己定制了一些东西)遵循this 启用分页的教程。我使用 QEMU 而不是 Bochs 作为我的模拟器。
如果我一直禁用分页,一切正常(即使是我实现的非常基本的kmalloc()),但只要我在cr0 寄存器中设置PG 位(即启用分页),一切都会崩溃并且QEMU重启:我怀疑我的某些结构(即页目录、页表等)没有正确创建或加载,但我无法检查。
一段时间以来,我一直在尝试解决这个问题,但还没有找到解决方案。谁能看到我的错误在哪里?
在这里你可以找到我的完整代码:https://github.com/davidedellagiustina/ScratchOS(提交83b5c8c)。分页代码位于src/cpu/paging.*。
编辑:完全按照this 教程设置超级基本页面目录会产生工作代码。基于这个简单的例子,我试图构建更复杂的结构(即page_t、page_table_t、page_directory_t)以了解错误。
【问题讨论】:
-
您的真正意思是“教学目的”(意图使用操作系统来教别人),还是真正的意思是“仅供我自己学习”?
-
@Brendan 我的意思是仅供个人使用。已编辑帖子。
-
假设您已经设置了一个有效的页面目录/表,在写入 CR3 寄存器(或通过 CR0 寄存器启用)之后,最常见的三重故障(重新启动)原因是写入之后的指令不再分页到它物理所在的位置。例如,您已将内核分页到 0xC0000000,但违规指令的物理地址仍位于分页启用之前的位置。您必须将该特定代码分页两次,一次在原始位置,一次在新位置,稍后删除旧位置。
-
使用 QEMU 而不是 Bochs 为什么? BOCHS 的内置调试器了解分段和 x86 模式,因此与使用常规 GDB 的 QEMU 的 GDB-remote 相比,它更适合调试 early-init 的东西。我认为有某种方法可以让内置调试器捕获三重故障并让您进行调查。
-
@PeterCordes 我正在使用 QEMU,因为我之前遵循的教程使用了它。我刚开始时并不知道 Bochs。
标签: intel paging qemu virtual-memory osdev