Почему вся физическая память должна отображаться для инициализации списка свободных страниц?

В сопроводительной книге на странице 32 говорится, что

Существует проблема начальной загрузки: вся физическая память должна быть сопоставлена, чтобы распределитель мог инициализировать свободный список, но создание таблицы страниц с этими сопоставлениями требует выделения страниц таблицы страниц.

Я не понимаю почему. Почему ядро ​​просто не заполняет все страницы 4K из [end,PHYSTOP) с struct run как это происходит для диапазона [end,4M)?

Почему вся физическая память должна быть уже отображена?

1 ответ

Решение

Во-первых, в [end, PHYSTOP)не 4к.

Теперь к вам вопрос (если я правильно понял).

Когда мы загружаемся в xv6, мы используем entrypgdir как наш эффективный каталог страниц, который отображает только [0, 4MB). Это единственные адреса, к которым мы можем получить доступ. Поэтому мы можем сопоставить только эти страницы с freerange(),

Сразу после kinit1(), который выделяет первые 4 МБ после окончания кода ядра, мы выделяем новый каталог страницы (kpgdir). Этот каталог страниц позволит нам достичь большего в памяти, поскольку он отображает всю нашу память (см. setupkvm()).

Другие вопросы по тегам