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