为什么启用分页后特定地址不可用?
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) 地址不可用并导致崩溃?
好吧,我只是忘了这一行 orl [=11=]b11, %eax
然后填写 p4_table 的第二个条目。一定是这样的:
movl , %ebx
movl p3_table, %eax
orl [=10=]b11, %eax
movl %eax, p4_table(,%ebx,8)
我只是想在实践中充分了解分页的工作原理。 我的分页代码的一部分:
.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) 地址不可用并导致崩溃?
好吧,我只是忘了这一行 orl [=11=]b11, %eax
然后填写 p4_table 的第二个条目。一定是这样的:
movl , %ebx
movl p3_table, %eax
orl [=10=]b11, %eax
movl %eax, p4_table(,%ebx,8)