Как интерпретировать%gs:0x14?
Я немного запутался с использованием двоеточия в сборке x86. Я знаю что в реальном режиме %gs:0x14
будет адрес %gs
сдвинуть 4 бита влево и добавить с 0x14
, Но это то же самое в защищенном режиме? Например, в защищенном режиме,
movl %gs:0x14 %eax
В каком смысле %gs:0x14
доступ? Это как 0x14(%gs)
или такой же как в реальном режиме?
Обновление: чтобы сделать мой вопрос более понятным, предположим, %gs = 0x1234
какое значение% eax после инструкции movl %gs:0x14 %eax
,
Дальнейшая информация:
Только что нашел этот документ полезным для функции GS и FS в разных системах http://www.akkadia.org/drepper/tls.pdf
И эта ссылка предоставляет информацию о сегменте: адрес смещения.
2 ответа
Во-первых, давайте разберемся с условиями. Кажется, вы используете "защищенный режим" в целом, в отличие от реального режима. Но, по крайней мере, в руководствах Intel этот термин применим только для 32-битного режима. Для 64-битного режима они используют плохо продаваемый термин "режим IA-32e", что ужасно по сравнению с "длинным режимом" AMD, но оба по-прежнему скрывают тот факт, что 64-битный режим также защищен.
Это различие важно, потому что работа с%gs отличается для 32- и 64-битного защищенного режима. Для 32 бит это еще один сегментный регистр. Код переключения потоков заполняет его базой сегментов для текущего потока в том же виртуальном пространстве, поэтому, в отличие от {CS,DS,ES,SS}, его база не равна нулю в плоском режиме. Для 64 бит это просто смещение, сохраняемое в MSR процессора и также изменяемое планировщиком на адрес TLS текущего потока. (Детали могут различаться для Linux/*BSD/Windows/ и т. Д., Какой из%fs и%gs используется для какой роли.) Но, как правило, когда вы видите доступ типа%gs:0x14, вы должны понимать, что
- Получен базовый адрес GS (с использованием, как объяснено выше, универсального метода для 32 бит и специальной обработки на основе MSR для 64-битной среды)
- 0x14 добавлен к этому адресу
и это все, что вам нужно знать, если вы не разрабатываете ядро или что-то глубоко системное, например Wine.
Вам необходимо внимательно прочитать спецификацию двоичного интерфейса приложения для вашей архитектуры (возможно, x86-64
), т.е. X86-64 ABI.
Вы узнаете, что %gs
связано с локальным хранилищем потока. Смотрите этот ответ.
Так что ваша машинная инструкция, вероятно, загружает слово со смещением 0x14
текущего TLS.