Использует ли 32 или 64-битный процессор адресацию сегментации в Linux? Я знаю, что на старых процессорах, таких как 8086, использовалась сегментация для адресации памяти, но не уверен, что этот метод используется на 32-битных или 64-битных процессорах для операционной системы Linux.
2 ответа
Первоначально (до 286) сегментация была в основном хаком, предназначенным для того, чтобы можно было адресовать более 64 КБ на 16-битном процессоре. В 286 защищенном режиме сегментация была расширена, чтобы ввести защиту, и расширила поддерживаемую физическую память с 1 МБ до 16 МБ. Но процессор все еще имел только 16-битные регистры, что означало, что любой непрерывный блок данных размером более 64 КБ был проблематичным для обработки.
Все это изменилось с введением 386. Регистры ЦП были расширены до 32 бит, и в качестве новой функции была добавлена подкачка. Разбиение на страницы было гораздо более мощным способом сопоставления логических и физических адресов, чем то, что было достигнуто с помощью сегментации.
Linux изначально был разработан для 386 и использовал функцию подкачки. Использование сегментации в Linux было минимальным, некоторые параметры защиты контролировались с помощью дескрипторов сегментов, что означало, что вы не могли полностью избежать необходимости сегментации. Но Linux настроит все сегменты для запуска по адресу 0.
Другими словами: Linux никогда не использовал сегментированную адресацию. Он использовал сегментацию только потому, что это требовалось для управления некоторыми функциями защиты.
Когда AMD разработала 64-битные процессоры, они решили, что некоторые исторические функции не будут поддерживаться в 64-битном режиме. Одной из вещей, которые они сделали, было принудительно установить начальный адрес сегмента 0. Таким образом, в этот момент сегментированные адреса больше не поддерживались ни аппаратным, ни программным обеспечением.
Если вы используете современный процессор в 16 или 32-битном режиме, он все еще поддерживает сегментированные адреса для обратной совместимости. Но в 64-битном режиме у вас есть только 64-битные линейные адреса и пейджинг.
У 8086 не было MMU, сравнимого с тем, что делают современные процессоры x86; с 386 и позже все было радикально иначе:
- произвольно много областей виртуальной памяти
- таблицы страниц для сопоставления этих
- Вложенные таблицы страниц просто для удобства работы
- дальнейшие формы виртуализации
Это довольно сложная тема, и я не думаю, что краткий обзор архитектуры управления памятью x86 можно просто дать в рамках ответа суперпользователя. Однако сегментация не является одним из терминов, которые можно использовать для описания этой архитектуры. Боюсь, я могу только попросить вас прочитать статью о 386 и дизайне операционной системы для x86.