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