Влияет ли регистры CS и DS на инструкции в x64 Intel? - PullRequest
1 голос
/ 25 января 2020

Afaik, они никогда не используются и CS = DS = SS в настоящее время. Однако, если бы я установил эти значения, что-то изменилось бы или процессор их проигнорировал. Я нашел действительно противоречивую информацию по этому вопросу, и я не понимаю, почему они все еще будут там, если их игнорируют. Помогите пожалуйста

1 Ответ

4 голосов
/ 26 января 2020

Да, регистры сегментов по-прежнему влияют на выполнение кода.

Вопрос и некоторые комментарии, похоже, не различают guish между значением селектора и базовым адресом. Чтобы четко понять некоторую противоречивую информацию, которую вы читаете по этой теме c, вам необходимо убедиться, что вы понимаете, какая обсуждается.

Селектор CS не может быть равен 0. Он должен относиться к допустимый дескриптор сегмента кода в GDT или LDT. Бит L дескриптора сегмента кода определяет, является ли текущий процесс режимом 64-битной или 32-битной совместимости.

CS (селектор) не может быть равен DS и SS. CS должен ссылаться на сегмент кода, тогда как DS и SS должны ссылаться на сегменты данных (возможно, один и тот же). Селекторам DS и SS разрешено быть 0 (что может вызвать сбой GP в 32-битном режиме).

Основной аспект сегментных регистров, который не все еще оказывает влияние базовый адрес и ограничение сегмента; базовые адреса CS, DS, ES и SS обрабатываются так, как будто они равны 0, и в 64-битном коде нет проверки ограничения сегмента. По этой причине люди видят, что их игнорируют.

Как упоминала Маргарет, текущий уровень привилегий (CPL) находится в младших 2 битах регистров селектора CS и SS, а также в битах DPL дескрипторы в GDT. Эти биты должны быть либо 0, либо 3, поскольку, насколько мне известно, ни одна из текущих операционных систем не использует кольца 1 и 2.

Еще один незначительный момент заключается в том, что некоторые ошибки, вызванные обращениями к памяти, вместо этого сообщаются как ошибки стека. ошибок GP, если доступ к памяти осуществляется с использованием сегмента SS (поскольку RBP или RSP используется в качестве базового регистра в операнде инструкции).

...