Unix xv6内核进程内存的基本限制

Unix xv6内核进程内存的基本限制,unix,process,kernel,xv6,Unix,Process,Kernel,Xv6,xv6书中有一个问题困扰了我很长时间,我想知道是否有人愿意对此进行澄清 KERNBASE限制单个进程可以使用的内存量,这可能是 在一台内存为4 GB的机器上进行刺激。提高基础是否允许 使用更多内存的进程 在我看来,这个问题的答案是否定的,因为围绕xv6的整个机制设计用于在特定地址空间上使用KERNBASE 谢谢你的回答。嗯,这里有个问题 所有应该使用的物理地址都映射到虚拟地址 0x8000000及以上 因此,如果您将内核升级,操作系统可以使用更少的物理内存。我也一直在考虑这个问题。这是我的结论,

xv6书中有一个问题困扰了我很长时间,我想知道是否有人愿意对此进行澄清

KERNBASE限制单个进程可以使用的内存量,这可能是 在一台内存为4 GB的机器上进行刺激。提高基础是否允许 使用更多内存的进程

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


谢谢你的回答。

嗯,这里有个问题

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


因此,如果您将内核升级,操作系统可以使用更少的物理内存。

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

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

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


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

如果更改,您必须修复v2p和p2v函数KERNBASE@Morass如何修复?他们在定义中使用宏。我不确定我是否理解你的推理。如果我理解正确的话,KERNBASE的选择有些武断。是的,它将从KERNBASE开始的地址映射到较低的地址,但唯一的一点是这样内核就可以在物理内存中生存,即使在那些高地址上没有可用内存。现在,假设我们有完整的4GB。由于内核不占用2GB,因此可以将KERNBASE安全地移动到(4Gb-sizeof(kernel))的位置,这将为进程保留剩余的可用物理内存。