Если я правильно понимаю, согласно руководствам Intel, x64 не использует сегментацию. Я прочитал Системное программирование AMD для AMD64 , чтобы понять это, так как их объяснения гораздо легче понять, поскольку они явно имеют дело с x86_64 (они, я полагаю, изобрели его); они заявляют:
В длинном режиме эффекты сегментации зависят от того, работает ли процессор в совместимости
режим или 64-битный режим:
- В режиме совместимости сегментация работает так же, как и в устаревшем режиме, используя устаревшую семантику защищенного 16-битного или 32-битного режима.
- 64-битный режим, сегментация отключена, создается плоское 64-битное виртуальное адресное пространство. Как будет видно, некоторые функции некоторых
регистры сегментов, в частности регистры сегментов системы, продолжаются
для использования в 64-битном режиме.
В частности, ищите раздел 4.8 Дескрипторы сегмента длинного режима. Чтобы ответить на ваш второй вопрос:
Поля, игнорируемые в 64-битном режиме. Сегментация отключена в 64-битной
режим и сегменты кода охватывают всю виртуальную память. В этом режиме базовые адреса сегмента кода игнорируются. Для расчета виртуального адреса базовый адрес обрабатывается так, как если бы он имел значение ноль.
Для интерпретации: поскольку «сегмент» в x86_64 является целым адресным пространством, базовый адрес не имеет смысла, кроме 0, поскольку все смещения являются абсолютными (относительно 0).
Таким образом, это ответило бы на первый вопрос, который я считаю - RIP принимается как 64-битное значение смещения. Со страницы описания ворот той же главы:
В длинном режиме дескрипторы шлюза расширяются на 64 бита, что позволяет им хранить 64-битные смещения.
Это становится более сложным при работе с сегментами данных, хотя:
Сегменты данных, на которые ссылаются регистры сегментов FS и GS, получают специальную обработку в 64-битном режиме.
Режим. Для этих сегментов поле базового адреса не игнорируется, и можно использовать ненулевое значение
в виртуально-адресных расчетах. 64-битный адрес базы сегмента может быть указан с помощью
конкретные регистры. См. «Регистры FS и GS в 64-битном режиме» на стр. 70 для получения дополнительной информации.
В этом разделе говорится:
FS и GS регистры в 64-битном режиме. В отличие от сегментов CS, DS, ES и SS, FS и GS
переопределения сегментов могут использоваться в 64-битном режиме. Когда переопределения сегментов FS и GS используются в 64-битном режиме
В этом режиме соответствующие базовые адреса используются при расчете эффективного адреса (EA). Полный
В этом случае расчет советника становится (FS или GS). Base + base + (scale * индекс) + смещение. FS.base
и значения GS.base также расширены до полного размера 64-битного виртуального адреса, как показано на рисунке 4-5.
В результате расчета советника разрешено переносить на положительные и отрицательные адреса.
В 64-битном режиме переопределения сегментов FS и GS не проверяются на наличие ограничений или атрибутов. Вместо,
процессор проверяет, что все ссылки на виртуальные адреса находятся в канонической форме.
Другими словами, сегменты данных могут действовать так же, как используется сегментация, хотя проверяется только форма сегментации, а не проверяется, находится ли форма доступа в границах сегмента.
Я думаю, что это правильное толкование; однако исправления / указатели очень ценятся.