为什么必须映射所有物理内存来初始化空闲页面列表?
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()
)。
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()
)。