【问题标题】:How to enable x86 paging only in ring 3如何仅在环 3 中启用 x86 分页
【发布时间】:2020-07-29 17:20:14
【问题描述】:

我知道设置 CR0 的 PG 位可以在 x86 中启用分页,并且生成的所有地址都将是逻辑的并使用页面目录和表进行转换。但是,我希望仅为环 3 生成逻辑地址,并希望将环 0 中的所有生成地址保留为物理地址。这能以某种方式实现吗?我曾想过在 IRET 之前设置 PG 位。但是我怀疑这会有所帮助,因为 IRET 使用 ESP 弹出 CS、EIP、EFLAGS、SS、ESP 等。如果设置了 PG 位,那么 ESP 将指向一个逻辑地址并且命令会失败,对吗?

【问题讨论】:

  • 它是干什么用的?您可以根据需要设置一些身份映射页面,然后分页可以继续进行

标签: operating-system paging osdev i386


【解决方案1】:

您想要的基本问题是 x86 不太擅长 pc 相对寻址;所以你需要在某个地址链接你的内核。那个地址是什么?

1M (2^20) 是个不错的选择。

接下来是你有多少内存? 4G?这有点难看,你的“一个真正的物理地图”没有为用户程序留下地址空间。查看 [2] 进行修复。 假设您实际上并不需要映射所有内存,只需要内核-y 位,并且您的内核可能小于 1G,那么您可以为较低的 1G 地址空间保持内核映射页面 1:1。用户程序将位于 > 1G 的虚拟地址中,具有任意映射。

不太确定这一切的意义;但这是完全可行的。

[2] 对于更棘手的情况,您可以做一些时髦的事情,其副作用是消除一些幽灵衍生的错误。当应用程序运行时,只为非常小的区域提供内核映射 - 处理初始内核/陷阱条目和内核用户上下文的代码。作为初始寄存器保存代码的一部分,切换到仅内核 cr3,它是所有内存的统一映射。如果您愿意,您实际上可以禁用分页,在重新进入用户模式之前重新启用它。同样,不确定这一点,但可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2021-11-15
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多