Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
配套书在第32 页说
有一个引导问题:必须映射所有物理内存,以便分配器初始化空闲列表,但是使用这些映射创建页表涉及分配页表页。
我不明白为什么。为什么内核不直接填充所有 4K[end,PHYSTOP)页面struct run不像 range 那样[end,4M)所有 4K 页面?
[end,PHYSTOP)
struct run
[end,4M)
为什么所有物理内存都必须已经映射?
首先,有更多的页面[end, PHYSTOP),而不是 4K。
[end, PHYSTOP)
现在问你问题(如果我理解正确的话)。
当我们启动到 xv6 时,我们使用entrypgdir我们的有效页面目录,它只映射 [0, 4MB)。这些是我们可以访问的唯一地址。因此,我们只能将这些页面映射到freerange().
entrypgdir
freerange()
在kinit1()内核代码结束后分配前 4MB 的 之后,我们分配一个新的页面目录 ( kpgdir)。这个页面目录将允许我们在内存中更进一步,因为它映射了我们所有的内存(请参阅 参考资料setupkvm())。
kinit1()
kpgdir
setupkvm()