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

Why all of physical memory must be mapped for initializing the free pages list?

companion book 在第 32 页说

There is a bootstrap problem: all of physical memory must be mapped in order for the allocator to initialize the free list, but creating a page table with those mappings involves allocating page-table pages.

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

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

首先,[end, PHYSTOP)中的页面多了很多,而不是 4K。

现在请你提问(如果我没理解错的话)。

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

紧接着 kinit1(),在内核代码结束后分配前 4MB,我们分配一个新的页目录 (kpgdir)。这个页面目录将允许我们在内存中到达更远的地方,因为它映射了我们所有的内存(参见 setupkvm())。