Как рассчитывается эффективный адрес с помощью регистров fs и gs - PullRequest
3 голосов
/ 18 января 2020

В x86_64 регистры fs и gs имеют ограниченную форму сегментации. Если взять в качестве примера fs, как fs регистрируется, FSBase MSR работает вместе для генерации эффективного адреса?

Что произойдет, если я изменю базу fs без изменения fs? Или изменение базы fs автоматически меняет fs?

Что произойдет, если я изменю регистр fs без изменения базы fs? Как влияют на вычисления эффективного адреса?

Мы можем привести краткий пример

mov %fs:(%eax), %ebx

1 Ответ

5 голосов
/ 18 января 2020

Архитектурный регистр FS отделен от внутреннего регистра базы FS.

Как всегда, при использовании переопределения сегмента просто выбирается база сегмента, связанная с этим сегментом, вместо базы DS по умолчанию или базы SS ( которые фиксируются на 0 в 64-битном режиме).

Фактическое значение в самом архитектурном регистре fs не имеет к нему никакого отношения . Он вступает в игру только в том случае, если вам нужно mov %fs, %eax фактически прочитать сам регистр FS, а не использовать связанные с ним внутренние «регистры» базы / предела.

Поскольку существуют способы установки внутренней FS base (например, с wrmsr или на более поздних процессорах инструкция wrfsbase ), которые более эффективны, чем mov до %fs (чтобы он загружал базу и лимит из GDT или LDT ), ОС обычно оставляют архитектурные регистры FS и GS = 0, нулевой селектор.

На голом металле вы тоже можете это сделать. Не беспокойтесь о создании записи GDT с нужной вам базой и mov с помощью селектора в %fs или %gs; просто установите базу непосредственно с помощью wrmsr или wrfsbase.

Что произойдет, если я изменю регистр fs без изменения базы fs?

Вы не можете, AFAIK , mov %reg/mem, %fs инициирует загрузку внутренних / предельных регистров сегмента из GDT или LDT (в зависимости от значения, которое вы перемещаете).

Обратите внимание, что некоторые люди называют эти внутренние вещи "кэшем", но они не кеширует. Они гарантированно сохранят значения с момента их загрузки, поэтому они никогда не изменятся, если вы измените запись GDT без перезагрузки регистра сегмента с этим селектором.

Как влияет на эффективный расчет адреса?

То же, что и всегда база + индекс * шкала + смещение. Обратите внимание, что «эффективный адрес» - это просто смещенная часть полного адреса, не включая селектор сегмента или базу. Что такое эффективный адрес?

Адрес linear также рассчитывается как всегда: segment_base + offset, где часть смещения - это эффективный адрес, указанный в режим адресации.

В режимах адресации по умолчанию используется база сегмента DS, если «базовый регистр» в режиме адресации не является E / RBP или E / RSP, и в этом случае это база SS. Но префиксный байт может переопределить значение по умолчанию; это то, что %fs: говорит ассемблеру испускать.

...