3

Я задаюсь вопросом о том, как можно управлять системой виртуальной памяти вместе с MMU, когда необходимо поддерживать некоторые "фиксированные" адреса в адресном пространстве.

Например, когда машина загружается, ЦПУ начинает считывать первую инструкцию с фиксированного адреса (который сопоставлен с каким-либо ПЗУ), затем выдает адреса периферийным устройствам (если используется система ввода-вывода с отображением в памяти), и Затем ОС загружается. Я также знаю, что подпрограммы прерывания и подобные вещи должны находиться в "фиксированной" позиции в памяти, и эти вещи загружаются ОС.

Я могу подумать, что MMU отключен в таком процессе, а затем он включен после загрузки ОС.

Я могу подумать, что процессы, описанные выше, используют системное адресное пространство и что системное адресное пространство не виртуализировано, несмотря на то, что на самом деле это адресное пространство пользователя.

Это приведет к тому, что пул физических адресов останется неизменным для доступа к периферийным устройствам ввода-вывода, подпрограммам прерывания и т.д., А также к виртуальному пользовательскому пространству, управляемому MMU, где процессы могут обрабатывать все данные, необходимые для разработки. , требующий к ОС доступа к периферийным устройствам ввода / вывода.

Но я не уверен в этих вещах. Вот я и спрашиваю, когда MMU на самом деле включен? Это касается всех адресов или только адресов пользователя? Правда ли, что некоторые адреса могут обходить MMU даже во время работы системы, чтобы получить доступ к фиксированным позициям памяти? Или я упускаю некоторые важные подсказки?

2 ответа2

1

Извините, но предположение в выбранном ответе вводит в заблуждение и не учитывает самый важный аспект, а именно перевод адресов через таблицы страниц.

Это правда, что при загрузке любого ПК-совместимого компьютера он запускается в "реальном режиме". А современные 32-битные операционные системы на x86 работают в "защищенном режиме", который включает сегментированную адресацию, как определено GDT. Однако затем они также разрешают трансляцию адресов на основе таблицы страниц, устанавливая бит PG (поискового вызова), бит 31, в CR0. Это никогда не отключается на всю жизнь ОС.

Кроме того, в большинстве современных 32-разрядных операционных систем сегментная адресация на основе GDT по существу игнорируется: все обычно используемые GDTE настроены с базовым адресом 0, размером 4 миллиарда байт. Таким образом, хотя MMU выполняет действия по добавлению "базового адреса" соответствующего сегмента к "смещению", которое происходит из инструкции, это фактически неиспользование. Другой набор GDTE используется для кольца 0 против кольца 3, но все они имеют одинаковый базовый адрес и размер. Поля "уровня привилегий" (0 против 3) - это все, что отличается. Это позволяет использовать бит "привилегированного доступа" в записях таблицы страниц, обеспечивая защиту памяти для доступа в режиме ядра или в режиме пользователя + в режиме ядра на каждой странице. Это невозможно с дескрипторами сегментов; они слишком крупнозернистые.

В процессорах x64 механизм сегментирования практически исчезает в длинном режиме. Конечно, трансляция адресов на основе таблицы страниц все еще происходит, пока установлен бит PG, что происходит на протяжении всей жизни ОС. MMU наиболее явно не отключен в режиме ядра, и при этом "SO" (или что-либо еще) не использует отображение 1:1 между виртуальными и физическими адресами.

Доступ к известным физическим адресам, например, назначенным периферийным устройствам, подобным PCI, осуществляется путем выделения неиспользуемых виртуальных адресов и установки соответствующих записей в таблице страниц с необходимыми номерами физических страниц. Код в драйверах устройств затем использует виртуальные адреса.

Да, DMA в основном работает на физических адресах. Простой / дешевый контроллер DMA просто переходит в физически непрерывный буфер с заданным начальным адресом и длиной. Для поддержки таких устройств ОС или драйвер устройства будут выделять физически смежные "буферы отказов" для доступа к устройству DMA и копировать данные между ними и буфером пользователя.

Умные / более дорогие контроллеры DMA могут обрабатывать буферы, которые занимают несмежные диапазоны физических адресов (называемые «отображением рассеяния-сбора»). Они очень предпочтительны для высокопроизводительных устройств.

IOMMU может позволить тупым / дешевым контроллерам прямого доступа к памяти получить доступ к физически несмежному буферу, как если бы он был смежным. Тем не менее, платформы с IOMMU еще недостаточно распространены, чтобы сказать, что "ваша платформа должна иметь IOMMU для нашей ОС". Поэтому в настоящее время модули IOMMU в основном используются мониторами виртуальных машин.

-1

Процессоры x86 загружаются в "реальном режиме" - в основном, в 16-разрядном режиме, когда процессор может видеть только первые 1 МБ ОЗУ. Одной из первых задач загрузчика BIOS (или UEFI может сделать это напрямую) является переключение процессора в "защищенный" режим. Защищенная память доступна в этом режиме, и процессор имеет уровни привилегий в этом режиме - обычно это "ядро" и "пользователь".

Я немного размышляю об этом, но как память карт MMU контролируется Глобальной таблицей дескрипторов (GDT). Режим ядра может изменить GDT, режим пользователя - нет.

Таким образом, при входе в режим ядра он может установить для GDT отображение памяти, которое либо идентифицирует всю карту памяти (т. Е. Действует так, как будто она вообще не отображается), либо отображает ее так, чтобы предоставить ей доступ ко всем устройствам и т.д. Когда он возвращается в пользовательский режим, он может загрузить более ограничивающий GDT перед возвратом управления.

Я могу ошибаться - может быть, когда процессор переходит в режим ядра, он просто отключает MMU, но я верю, что он может использоваться и в режиме ядра таким же образом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .