companion book在第32页上说
存在引导问题:必须映射所有物理内存 命令分配器初始化空闲列表,但创建一个 带有这些映射的页表涉及分配页表页面。
我不明白为什么。为什么内核不会像使用[end,PHYSTOP)
一样填充struct run
的所有4K页面,就像填充范围[end,4M)
一样?
为什么必须已经映射了所有物理内存?
答案 0 :(得分:1)
首先,[end, PHYSTOP)
中有更多页面,而不是4K。
现在你有问题(如果我理解的话)。
当我们启动到xv6时,我们使用entrypgdir
作为我们的有效页面目录,它只映射[0,4MB]。这些是我们可以访问的唯一地址。因此,我们只能使用freerange()
映射这些页面。
在kinit1()
之后,在内核代码结束后首先分配4MB,我们分配一个新的页面目录(kpgdir
)。这个页面目录将允许我们在内存中进一步扩展,因为它映射了我们所有的内存(参见setupkvm()
)。