问题描述
我只想完全了解分页在实践中是如何工作的。 我的分页代码的一部分:
.section .bss
.align 4096
p4_table:
.skip 4096
p3_table:
.skip 4096
p2_table:
.skip 4096
以及更多代码:
set_up_page_tables:
movl $p3_table,%eax
orl $0b11,%eax // present + writable
mov %eax,(p4_table)
movl $0b10000011,(p3_table)
movl $1,%ebx
movl $0b10000011,%eax
movl %eax,p3_table(,%ebx,8)
movl $1,%ebx
movl p3_table,p4_table(,8)
这里我填写了 p3_table(PDPT) 中的两个条目。我在 p4_table(PML4) 中填写了两个条目。据我了解,p3_table 中的一个条目编码 1g,而 p4_table 中的一个条目编码 512g。由于我用 0b10000011 在 p3_table 中填充了 2 个条目,因此它编码了 0x0 - 0x80000000(0-2g) 形式的地址。我将 p3_table 放在 p4_table 的第二个条目中,它必须对 0x8000000000-0x8080000000(512g-514g) 中的地址进行编码。如果我运行我的程序(内核)0-2g 地址可用,但为什么 0x8000000000-0x8080000000(512g-514g) 中的地址不可用并导致崩溃?
完整来源:https://github.com/JustVic/kernel_for_testing
解决方法
好吧,我只是忘记了这一行 orl $0b11,%eax
然后填写 p4_table 的第二个条目。应该是这样的:
movl $1,%ebx
movl p3_table,%eax
orl $0b11,%eax
movl %eax,p4_table(,%ebx,8)