Для чего предназначен регистр"FS"/" GS"?
поэтому я знаю, что следующие регистры и их использование должны быть:
CS = сегмент кода (используется для IP)
DS = сегмент данных (используется для MOV)
ES = сегмент назначения (используется для МОВС и др.)
SS = сегмент стека (используется для SP)
но для чего предназначены следующие регистры?
FS = "Файловый Сегмент"?
GS = ???
Примечание: я не спрашивая о какой-либо конкретной операционной системе-я спрашиваю о том, что они предназначались для использования процессором, если что-нибудь.
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-битном theGS
регистр используется для указания на определенные операционной системой структуры.FS
иGS
обычно используются ядрами ОС для доступа к потоковой памяти. В windows, theGS
регистр используется для управления потоковой памятью. Ядро linux используетGS
для доступа к cpu-specific память.
FS используется для указания на информационный блок потока (TIB) в процессах windows .
один типичный пример ( SEH), которая хранит указатель на функцию обратного вызова в
FS:[0x00]
.GS обычно используется в качестве указателя на локальное хранилище потоков (TLS). и один пример, который вы могли видеть раньше, - это защита канарейки стека (stackguard) , в gcc вы можете увидеть что-то вроде этого :
mov eax,gs:0x14 mov DWORD PTR [ebp-0xc],eax