Как выполняется преобразование адреса (virt-> phy), когда ЦП требует адрес выше 0xC0000000? - PullRequest
3 голосов
/ 29 марта 2012

Я задал этот вопрос, потому что я не понимаю, как осуществляется преобразование адресов в области ядра.

Из того, что я понимаю, для перевода любого адреса выше 0xC0000000 нам просто нужно минусэтот адрес с PAGE_OFFSET (кроме процесса инициализации ядра, где нам нужна таблица страниц для диапазона 8 МБ).Но это не имеет смысла, когда процессор выполняет инструкцию, которая требует адрес, скажем, 0xF0000020, в то время как система имеет только 256 МБ ОЗУ.

По вышеуказанной причине, я думаю, что ядро ​​действительно имеет таблицу страницчто позволяет MMU переводить виртуальный адрес выше 0xC0000000 в физический.Таким образом, в какой ситуации мы можем напрямую минус PAGE_OFFSET и в какой ситуации нам нужна таблица страниц ядра?

Я могу ошибиться в начале, поэтому, пожалуйста, исправьте.


РЕДАКТИРОВАТЬ

Из << Понимание диспетчера виртуальной памяти Linux >>, где говорится, что таблица страниц ядра существует.Теперь более запутанно ...

3.6 Таблицы страниц ядра

При первом запуске системы подкачка страниц не включена, поскольку таблицы страниц сами по себе магически не инициализируются,Каждая архитектура реализует это по-своему, поэтому будет обсуждаться только случай x86.Инициализация таблицы страниц делится на две фазы.На этапе начальной загрузки таблицы страниц устанавливаются всего на 8 МБ, чтобы можно было включить модуль подкачки. Второй этап инициализирует остальные таблицы страниц .Обе эти фазы обсуждаются в следующих разделах.

3.6.1 Начальная загрузка

...

3.6.2 Завершение

Функция, отвечающая за финализацию таблиц страниц, называется paging_init ().График вызовов для этой функции на x86 можно увидеть на рисунке 3.4.enter image description here

Функция сначала вызывает pagetable_init () для инициализации таблиц страниц, необходимых для ссылки на всю физическую память в ZONE_DMA и ZONE_NORMAL.Помните, что на высокую память в ZONE_HIGHMEM нельзя напрямую ссылаться, и что для нее временно установлены сопоставления.Для каждого pgd t, используемого ядром, для выделения страницы для PGD вызывается распределитель загрузочной памяти (см. Главу 5), и бит PSE будет установлен, если он доступен, для использования записей TLB 4 МБ вместо 4 КБ.Если бит PSE не поддерживается, страница для PTE будет выделена для каждого pmd t.Если процессор поддерживает флаг PGE, он также будет установлен таким образом, чтобы запись в таблице страниц была глобальной и видимой для всех процессов.

Далее, pagetable_init () вызывает fixrange_init () для установки фиксированного адресного пространства.сопоставления в конце виртуального адресного пространства, начиная с FIXADDR_START.Эти сопоставления используются для таких целей, как локальный расширенный программируемый контроллер прерываний (APIC) и атомарные сопоставления между FIX_KMAP_BEGIN и FIX_KMAP_END, требуемые kmap_atomic ().Наконец, функция вызывает fixrang_init (), чтобы инициализировать записи таблицы страниц, необходимые для нормальных отображений высокой памяти, с помощью kmap ().

После возврата pagetable_init () таблицы страниц для пространства ядра теперь полностью инициализированы, поэтомуstatic PGD (swapper_pg_dir) загружается в регистр CR3, так что статическая таблица теперь используется модулем подкачки.

Следующая задача paging_init () отвечает за вызов kmap_init () для инициализации каждого изPTE с флагами защиты PAGE_KERNEL.Последняя задача - вызвать zone_sizes_init (), которая инициализирует все используемые структуры зон.

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

Хотя линейное отображение может показаться особенным для человека, оно (обычно) не является особенным с точки зрения конфигурации MMU.

Итак, как вы сказали, для перевода виртуального адреса из 3G в 3G +900 МБ, мы можем напрямую исключить эти адреса с помощью PAGE_OFFSET.Означает ли это, что ядру не нужны таблицы страниц?

Эти таблицы все еще нужны для объяснения этого конкретного (линейного) отображения в MMU.Хотя есть некоторые особые случаи, такие как MIPS R3000 .

Но это не имеет смысла, когда ЦП выполняет инструкцию, для которой требуется адрес, например, 0xF0000020

Я бы спросил, имеет ли смысл выполнять инструкции по этому адресу.Я имею в виду, что в системе с 256 МБ ОЗУ вы просто не встретите такой запрос (по крайней мере, если предположить, что код не содержит ошибок).

Смущает вас вопрос ИМО: кто отвечает за выполнениеадресные переводы?Ответ (опять же, обычно) MMU, реализованный аппаратно.Поэтому таблицы страниц - это способ сказать MMU, как он должен выполнять такие переводы - это не является обязанностью ядра.Ядру просто нужно сконфигурировать MMU.

Как выполняется преобразование адреса (virt-> phy), когда ЦП требует адрес выше 0xC0000000?

Так же, как и дляадреса ниже. Это чтение может быть полезным.

0 голосов
/ 29 августа 2014

На самом деле ваша пользовательская программа или даже ядро ​​использует виртуальную адресацию.Это означает, что каждый запрос памяти проходит через MMU.Если он проходит через MMU, он использует таблицы страниц (см. Регистр CR3 на x86)

virtual addr --> MMU --> physical addr 

И ядро ​​не использует магическую оптимизацию при доступе к lowmem.Да, lowmem отображается напрямую, поэтому с человеческой точки зрения вы можете преобразовать виртуальные адреса lowmem в физические простым вычитанием, но CPU выполняет это преобразование через таблицы страниц ядра.

0 голосов
/ 29 марта 2012

Существует линейное отображение для первых 900 МБ физической памяти (если оно существует), так что виртуальный адрес для этой памяти равен физической памяти плюс PAGE_OFFSET.Конечно, это не мешает отображению той же физической памяти в другом месте адресного пространства процесса, если ядро ​​захочет использовать эту память для других целей.

...