为什么必须映射所有物理内存以初始化空闲页面列表?

时间:2015-07-01 11:44:41

标签: xv6

companion book在第32页上说

  

存在引导问题:必须映射所有物理内存   命令分配器初始化空闲列表,但创建一个   带有这些映射的页表涉及分配页表页面。

我不明白为什么。为什么内核不会像使用[end,PHYSTOP)一样填充struct run的所有4K页面,就像填充范围[end,4M)一样?

为什么必须已经映射了所有物理内存?

1 个答案:

答案 0 :(得分:1)

首先,[end, PHYSTOP)中有更多页面,而不是4K。

现在你有问题(如果我理解的话)。

当我们启动到xv6时,我们使用entrypgdir作为我们的有效页面目录,它只映射[0,4MB]。这些是我们可以访问的唯一地址。因此,我们只能使用freerange()映射这些页面。

kinit1()之后,在内核代码结束后首先分配4MB,我们分配一个新的页面目录(kpgdir)。这个页面目录将允许我们在内存中进一步扩展,因为它映射了我们所有的内存(参见setupkvm())。