Какой метод перевода виртуальной памяти (например, x86) используется в целом?

Известно, что существуют различные виды трансляции виртуальных адресов (x86) с помощью MMU, такие как сегментация, пейджинг, комбинированная сегментация-пейджинг (постраничная сегментация, сегментированный пейджинг) и т. Д. У каждого есть свои преимущества и недостатки.

Мои вопросы: 1) Используются ли в общих операционных системах, таких как Linux/Windows, только один конкретный метод (например, пейджинг)? 2) Если для данной ОС доступно 2 или более методов, когда и где будет использоваться каждый из них? Можем ли мы настроить в соответствии с нашими потребностями? 3) Если используется только "Paging", то каким образом используются сегментные регистры x86?

1 ответ

В целом, современные операционные системы на x86 используют разбиение на страницы, а не сегментацию. Это означает, что базовый адрес регистров сегмента установлен на ноль, а предел сегмента установлен на максимум. Пейджинг используется для сопоставления виртуальных адресов с физическими адресами, что дает операционной системе возможность точного контроля адресного пространства процесса, защиты между процессами и защиты между привилегированным (ядром) и адресным пространством пользователя. Сегменты все еще используются в x86 для специальных целей:

  • запускать устаревшие операционные системы и приложения в виртуальной среде
  • для эффективного доступа к локальному хранилищу потоков для каждого потока в многопоточном приложении (спасибо @PaulA.Clayton за это).

Microsoft Windows перешла от сегментации к flat, linear Модель памяти с Windows 95.

http://technet.microsoft.com/en-us/library/cc751120.aspx

Windows 95 решает эту проблему, используя 32-разрядные возможности архитектуры процессора 80386 (и выше) для поддержки плоской линейной модели памяти для функциональности 32-разрядной операционной системы и приложений на основе Win32. Модель линейной адресации упрощает процесс разработки для поставщиков приложений и устраняет потери производительности, налагаемые архитектурой сегментированной памяти.

Для запуска старых приложений Win16 (Windows 3.1) в Windows 95 использовалась 16-разрядная виртуальная машина, на которой запускались все приложения Win16. Более новые 32-разрядные приложения выполнялись в отдельных адресных пространствах с использованием функции пейджинга MMU.

Вот соответствующее описание по ссылке выше

введите описание изображения здесь

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