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


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

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

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

  • ES = сегмент назначения (используется для МОВС и др.)

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

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

  • FS = "Файловый Сегмент"?

  • GS = ???

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

3 69

3 ответа:

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

1966 Multics операционная система, который рассматривал файлы как просто адресуемые сегменты памяти. Нет BS " открыть файл, запись записи, закрыть файл", просто "сохраните это значение в этом виртуальном сегменте данных" с грязной промывкой страницы.

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

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

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

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

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

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

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

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

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

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