Имеют ли регистры сегментов x86 особое значение/использование в современных процессорах и операционных системах?

Процессоры x86 имели всевозможные сложные режимы и сегментацию памяти на протяжении поколений от 16-битных до 32-битных и 64-битных.

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

Таким образом, очевидно, что сегментные регистры существуют для обратной совместимости, но единственная ли это причина?

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

Этот вопрос был навеян комментариями к этой старой ветке переполнения стека: Почему инструкция mov должна использоваться таким образом?


person hippietrail    schedule 17.03.2014    source источник


Ответы (1)


В 2002 году хакер ядра Linux Инго Молнар использовал сегментацию при реализации Exec Shield, формы выполнения данных. предотвращения, на 32-битных системах x86. Это одно из современных применений сегментации, о котором я знаю, но в основном оно направлено на максимальное использование аппаратных механизмов, которые вы не можете изменить. Сегментация не используется для предотвращения выполнения данных на процессорах x86-64 с поддержкой NX.

Сегментные регистры FS и GS по-прежнему используются в x86-64:

В 64-битном режиме сегментация обычно (но не полностью) отключена, что создает плоское 64-битное линейное адресное пространство. Процессор обрабатывает базу сегментов CS, DS, ES, SS как ноль, создавая линейный адрес, равный эффективному адресу. Сегменты FS и GS являются исключениями. Эти сегментные регистры (содержащие базу сегментов) можно использовать в качестве дополнительных базовых регистров при вычислении линейных адресов. Они облегчают обращение к локальным данным и определенным структурам данных операционной системы.

Руководство по системному программированию Intel, глава 3.2.4

В x86-64 Linux использует FS для локального хранилища потока и GS для пространства ядра на данные процессора. См. Как регистры fs/gs используются в Linux AMD64? и Подробнее о MSR_GS_BASE в linux x86 64

person scottt    schedule 17.03.2014
comment
Насколько мне известно, неисполняемый стек с помощью сегментации впервые был предложен Solar Designer (и я думаю, что он все еще доступен в OpenWall Linux) в 90-х годах. Использование FS и GS для TLS — это просто хак, позволяющий избежать использования GPR (особенно на нехватке ресурсов x86, в отличие от x86-64). - person ninjalj; 04.04.2014