Хотя это старый вопрос, подумайте над тем, чтобы ответить на него, поскольку это может помочь некоторым другим, таким как я, попытаться получить достаточные ответы от stackoverflow.
Ваше объяснение почти правильное, но вы хотите дать небольшое объяснение этому:
периферийные устройства инициализируются загрузчиком, а затем отображаются в физическую память
Периферийные устройства Onchip уже имеют предопределенное физическое адресное пространство. Для других внешних периферийных устройств с отображением ввода-вывода (например, PCIe) нам необходимо настроить физическое пространство адресов, но диапазон их физического адресного пространства все еще предопределен. Они не могут быть настроены в произвольном адресном пространстве.
Теперь на ваши вопросы, вот мои ответы ..
Как загрузчик инициализирует периферийные устройства, если они еще не были сопоставлены с адресным пространством?
Как я уже упоминал выше, все периферийные устройства (на кристалле) имеют заранее заданное физическое адресное пространство (обычно это будет указано в главе «Карта памяти» процессора RM). Таким образом, загрузчики (при условии, что MMU выключен) могут напрямую обращаться к ним.
При отображении виртуальной памяти существуют таблицы, которые сообщают MMU, куда и что отображать. Но что определяет, где периферийные устройства отображаются в физической памяти?
В VMM существуют таблицы страниц (созданные и хранящиеся в физической памяти DRAM ядром), которые сообщают MMU о необходимости сопоставления виртуального адреса с физическим адресом. В ядре linux с виртуальным пространством ядра 1G (скажем, виртуальные аддеры ядра от 0xc0000000-0xffffffff) периферийным периферийным устройствам необходимо иметь пространство виртуальных машин из указанного выше пространства виртуальных ядер ядра (чтобы ядро и только ядро могли получить к нему доступ); и таблицы страниц будут настроены для сопоставления этого периферийного виртуального адреса с его фактическим физическим адресом (определенным в RM)