Для чего предназначен регистр "FS" / "GS"?

Итак, я знаю, какие должны быть следующие регистры и их использование:

  • CS = Сегмент кода (используется для IP)

  • DS = Сегмент данных (используется для MOV)

  • ES = Целевой сегмент (используется для MOVS и т.д.)

  • SS = сегмент стека (используется для SP)

Но каковы следующие регистры, предназначенные для использования?

  • FS = "File Segment"?

  • GS =

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

Ответ 1

Для чего они предназначены и для чего они используются Windows и Linux.

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

Наши текущие операционные системы 2010 года - гигантский шаг назад, поэтому их называют "евнухами". Вы можете обращаться только к одному сегменту технологического пространства, предоставляя так называемое "плоское (IMHO тусклое) адресное пространство". Сегментные регистры на машине x86-32 все еще могут использоваться для регистров реального сегмента, но никто не беспокоился (Энди Гроув, бывший президент Intel, имел довольно известный общественный подход в прошлом веке, когда он понял, что все эти инженеры Intel потратили энергию и его деньги для реализации этой функции, что никто не собирается ее использовать. Иди, Энди!)

AMD, перейдя на 64 бита, решила, что им неважно, исключили ли они Multics в качестве выбора (что благотворительная интерпретация, невзрачный, они не знают о Multics) и поэтому отключили общие возможности регистров сегментов в 64-битном Режим. По-прежнему существует потребность в потоках для доступа к локальному хранилищу потоков, и каждому потоку нужен указатель... где-то в прямом доступном состоянии потока (например, в регистрах)... для локального хранилища. Поскольку Windows и Linux использовали FSand GS (спасибо Nick за разъяснение) для этой цели в 32-битной версии, AMD решила использовать регистры 64-разрядных сегментов (GS и FS), по существу, только для этой цели (я думаю, вы можете заставить их указывать в любом месте вашего пространства процесса; dunno, если код приложения может их загрузить или нет). Intel в их панике не потеряла долю на рынке AMD на 64 бита, а Энди, вышедший на пенсию, решил просто скопировать схему AMD.

Было бы архитектурно красивее IMHO, чтобы каждая карта памяти нитей имела абсолютный виртуальный адрес (например, 0-FFF say), который был его локальным хранилищем потоков (не требуется указатель регистра [segment]!); Я сделал это в 8-битной ОС еще в 1970-х годах, и это было очень удобно, например, иметь еще один большой стек регистров для работы.

Итак, регистры сегментов теперь похожи на ваше приложение. Они служат рудиментарной цели. К нашей коллективной утрате.

Те, кто не знает историю, не обречены повторять это; они обречены на то, чтобы делать что-то нелепое.

Ответ 2

Регистры FS и GS являются регистровыми регистрами. Они не имеют цели, определенные процессором, но вместо этого им назначается ОС, запускающая их. В 64-разрядной версии Windows регистр GS используется для указания структур, определенных операционной системой. FS и GS обычно используются ядрами ОС для доступа к потоковой памяти. В окнах регистр GS используется для управления потоковой памятью. Ядро linux использует GS для доступа к памяти, специфичной для процессора.

Ответ 3

FS используется для указания на информационный блок потока (TIB) в процессах Windows.

Типичным примером является (SEH), который хранит указатель на функцию обратного вызова в FS:[0x00].

GS обычно используется как указатель на локальное хранилище потока (TLS). и один пример, который вы, возможно, видели раньше, это защита стека канареек (stackguard), в gcc вы можете увидеть что-то вроде этого:

mov    eax,gs:0x14
mov    DWORD PTR [ebp-0xc],eax

Ответ 4

Согласно Руководству Intel, в 64-битном режиме эти регистры предназначены для использования в качестве дополнительных базовых регистров в некоторых вычислениях линейных адресов. Я вытащил это из раздела 3.7.4.1 (стр. 86 в наборе из 4 томов). Обычно, когда ЦП находится в этом режиме, линейный адрес совпадает с эффективным адресом, поскольку сегментация часто не используется в этом режиме.

Таким образом, в этом плоском адресном пространстве FS & GS играют роль не только в локальных данных, но и в определенных структурах данных операционной системы (стр. 2793, раздел 3.2.4), таким образом, эти регистры предназначались для использования операционной системой, однако эти конкретные разработчики определить.

При использовании переопределений в 32- и 64-разрядных режимах есть несколько интересных хитростей, но это требует использования привилегированного программного обеспечения.

С точки зрения "первоначальных намерений", это трудно сказать, кроме как просто дополнительные регистры. Когда процессор находится в режиме реального адреса, это похоже на то, что процессор работает на высокой скорости 8086, и программа должна явно обращаться к этим регистрам. Ради настоящей эмуляции 8086 вы бы запускали процессор в режиме virtual-8086, и эти регистры не использовались бы.