assembly - 如何直接从32位切换到PAE分页?

标签 assembly x86 paging osdev page-tables

我正在为我的个人研究开发一个微内核。我选择在 0xf0000000 运行我的内核,为用户空间程序留出 3.75 GiB。当我的内核启动时,它会设置 32 位分页(使用硬编码页目录和页表)。然后它检查主机是否支持 PAE 并设置页目录指针表 (PDPT)。但是当我尝试将它加载到 %cr3 时,问题就来了。根据英特尔软件开发人员手册:

Software can transition between 32-bit paging and PAE paging by changing the value of CR4.PAE with MOV to CR4.

于是尝试使用如下代码切换到PAE分页:

movl %cr4, %eax
orl $(1 << 5), %eax
movl %eax, %cr4
movl %ebx, %cr3 // %ebx holds physical address to PDPT

或者,在 Intel 语法(或 NASM)中:

mov eax, cr4
or eax, 1 << 5
mov cr4, eax
mov cr3, ebx // ebx holds physical address to PDPT

但它失败了(在 QEMU 上)。它写入 %cr4,将 %eip 设置为下一条指令,执行它(至少 GDB 这么说),然后重置。我试着在%cr4之前写入%cr3,但结果还是一样。

然后我尝试通过以下方式切换到 PAE 分页:取消设置 PG -> 设置 PAE -> 写入 %cr3 -> 设置 PG,我成功了。但是我想直接切换到 PAE 寻呼。这怎么可能?

最佳答案

Then I tried to switch to PAE paging by: unset PG -> set PAE -> write to %cr3 -> set PG and I succeeded. But I want switch to PAE paging directly. How is that possible?

这不可能。

如果“普通分页”已经在使用/启用,那么你不能自动启用 PAE 并同时加载 CR3,所以(无论你是先加载 CR3 再加载 CR4,还是先加载 CR4 然后尝试加载 CR3) 无论哪条指令先发生,都会导致 CPU 在获取第二条指令之前崩溃。

唯一的方法是暂时禁用分页。

关于assembly - 如何直接从32位切换到PAE分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67484310/

相关文章:

gcc - 错误为 "impossible constraint in asm"的 ARM 内联汇编代码

assembly - 为什么IA-32具有非直观的主叫方和被叫方注册保存约定?

c - 如何计算程序使用的页数以及页码的引用顺序?

asp.net - GridView 分页问题

asp.net-mvc - 我如何使用 linq 翻页到我的列表

assembly - 如何正确读取Bios数据区地址中的值?

assembly - x86 汇编中符号扩展中的前导零?

c - SIGSEGV 恢复?

assembly - 如何在 nasm 中启用 a20?

assembly - 在不使用相关性的情况下直接在 ASM 中调用/跳转(x86)