【问题标题】:xv6 KERNBASE limitation of process memoryxv6 KERNBASE 对进程内存的限制
【发布时间】:2016-05-04 07:36:05
【问题描述】:

xv6的书里有个问题困扰了我很久,不知道有没有人想澄清一下

KERNBASE 限制单个进程可以使用的内存量,这可能是 对具有完整 4 GB RAM 的机器感到恼火。提高 KERNBASE 是否允许 进程使用更多内存?

在我看来,这个问题的答案是否定的,因为围绕 xv6 的整个机制旨在与特定地址空间上的 KERNBASE 一起使用。

感谢您的任何回答。

【问题讨论】:

    标签: unix process kernel xv6


    【解决方案1】:

    嗯,这里有个问题。

    所有应该使用的物理地址都映射到虚拟地址 0x80000000 及以上。

    因此,如果将 KERNBASE 向上移动,操作系统可以使用更少的物理内存。

    【讨论】:

      【解决方案2】:

      我也一直在考虑这个问题。以下是我的结论——尽管我不能真正保证它们。主要是演绎。

      首先,您提出的解释在技术上是错误的。 xv6 可以使用更高的和更低的 KERNBASE 值。您可以通过将KERNBASE 更改为0x90000000 然后更改kernel.ld(将内容放入预期地址的链接器脚本)中的相关值来测试这一点。

      据我所知,这里的真正问题是 xv6 没有对磁盘进行任何分页。现在,请记住在 xv6 中地址 0x80000000 (KERNBASE) 并向上映射到 0x00000000..0xffffffff。这意味着您在整个系统中分配的任何内存字节都映射到 32 位空间中的 2 个不同的物理地址。由于 xv6 不对磁盘进行分页,这意味着如果它为用户进程分配内存(使用sbrk() 系统调用,由malloc() 在用户空间中使用),那么它将一直保留在内存中。再说一遍,由于我们有 2 个“副本”,或者更准确地说是 2 个映射到同一个地址,我们实际上不能使用超过 32 位地址空间中可用内存的一半。

      现在,回想一下 KERNBASE 被定义为 0x80000000,这正是:可用内存的一半。所以不,在这些条件下提高 KERNBASE 不能给我们更多的用户空间内存。

      【讨论】:

      • 如果你改变了 KERNBASE,你将不得不修复 v2p 和 p2v 函数
      • @Morass 修复如何?他们在定义中使用宏。
      • 我不确定我是否遵循您的推理。如果我理解正确的话,KERNBASE 的选择有点武断。是的,它将从 KERNBASE 开始的地址映射到低地址,但唯一的一点是,即使这些高地址没有可用内存,内核也可以存在于物理内存中。现在,假设我们有完整的 4 Gbs。由于内核不占用 2Gbs,因此 KERNBASE 可以安全地移动到 (4Gb - sizeof(kernel)) 点,这应该将剩余的可用物理内存留给进程。
      猜你喜欢
      • 2011-01-24
      • 2012-02-27
      • 2023-04-05
      • 2011-06-18
      • 2011-10-16
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多