Почему вся физическая память должна отображаться для инициализации списка свободных страниц?
В сопроводительной книге на странице 32 говорится, что
Существует проблема начальной загрузки: вся физическая память должна быть сопоставлена, чтобы распределитель мог инициализировать свободный список, но создание таблицы страниц с этими сопоставлениями требует выделения страниц таблицы страниц.
Я не понимаю почему. Почему ядро просто не заполняет все страницы 4K из [end,PHYSTOP)
с struct run
как это происходит для диапазона [end,4M)
?
Почему вся физическая память должна быть уже отображена?
1 ответ
Во-первых, в [end, PHYSTOP)
не 4к.
Теперь к вам вопрос (если я правильно понял).
Когда мы загружаемся в xv6, мы используем entrypgdir
как наш эффективный каталог страниц, который отображает только [0, 4MB). Это единственные адреса, к которым мы можем получить доступ. Поэтому мы можем сопоставить только эти страницы с freerange()
,
Сразу после kinit1()
, который выделяет первые 4 МБ после окончания кода ядра, мы выделяем новый каталог страницы (kpgdir
). Этот каталог страниц позволит нам достичь большего в памяти, поскольку он отображает всю нашу память (см. setupkvm()
).