微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么启用分页后特定地址不可用?

我只想完全了解分页在实践中是如何工作的。 我的分页代码的一部分:

  .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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。