Какой метод перевода виртуальной памяти (например, 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.
Вот соответствующее описание по ссылке выше