为什么启用分页后特定地址不可用?

Why after enable paging specific address is not available?

我只是想在实践中充分了解分页的工作原理。 我的分页代码的一部分:

  .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 [=11=]b11, %eax       // present + writable
mov %eax, (p4_table)
movl [=11=]b10000011, (p3_table)


movl , %ebx
movl [=11=]b10000011, %eax
movl %eax, p3_table(,%ebx,8)


movl , %ebx
movl p3_table, %eax
movl %eax, p4_table(,%ebx,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 [=11=]b11, %eax 然后填写 p4_table 的第二个条目。一定是这样的:

movl , %ebx
movl p3_table, %eax
orl [=10=]b11, %eax
movl %eax, p4_table(,%ebx,8)