【发布时间】:2016-05-04 07:36:05
【问题描述】:
xv6的书里有个问题困扰了我很久,不知道有没有人想澄清一下
KERNBASE 限制单个进程可以使用的内存量,这可能是 对具有完整 4 GB RAM 的机器感到恼火。提高 KERNBASE 是否允许 进程使用更多内存?
在我看来,这个问题的答案是否定的,因为围绕 xv6 的整个机制旨在与特定地址空间上的 KERNBASE 一起使用。
感谢您的任何回答。
【问题讨论】:
xv6的书里有个问题困扰了我很久,不知道有没有人想澄清一下
KERNBASE 限制单个进程可以使用的内存量,这可能是 对具有完整 4 GB RAM 的机器感到恼火。提高 KERNBASE 是否允许 进程使用更多内存?
在我看来,这个问题的答案是否定的,因为围绕 xv6 的整个机制旨在与特定地址空间上的 KERNBASE 一起使用。
感谢您的任何回答。
【问题讨论】:
嗯,这里有个问题。
所有应该使用的物理地址都映射到虚拟地址 0x80000000 及以上。
因此,如果将 KERNBASE 向上移动,操作系统可以使用更少的物理内存。
【讨论】:
我也一直在考虑这个问题。以下是我的结论——尽管我不能真正保证它们。主要是演绎。
首先,您提出的解释在技术上是错误的。 xv6 可以使用更高的和更低的 KERNBASE 值。您可以通过将KERNBASE 更改为0x90000000 然后更改kernel.ld(将内容放入预期地址的链接器脚本)中的相关值来测试这一点。
据我所知,这里的真正问题是 xv6 没有对磁盘进行任何分页。现在,请记住在 xv6 中地址 0x80000000 (KERNBASE) 并向上映射到 0x00000000..0xffffffff。这意味着您在整个系统中分配的任何内存字节都映射到 32 位空间中的 2 个不同的物理地址。由于 xv6 不对磁盘进行分页,这意味着如果它为用户进程分配内存(使用sbrk() 系统调用,由malloc() 在用户空间中使用),那么它将一直保留在内存中。再说一遍,由于我们有 2 个“副本”,或者更准确地说是 2 个映射到同一个地址,我们实际上不能使用超过 32 位地址空间中可用内存的一半。
现在,回想一下 KERNBASE 被定义为 0x80000000,这正是:可用内存的一半。所以不,在这些条件下提高 KERNBASE 不能给我们更多的用户空间内存。
【讨论】: