Что такое опция компилятора GCC для получения префикса переопределения сегмента в x86
У меня есть макет памяти (в увеличении памяти) как:
Секция кода (0-4k), секция данных (4k-8k), секция стека (8k-12k), секция пользовательских данных (12k-16k).
Я поместил несколько специальных массивов, структур в разделе пользовательских данных.
Как я знаю, селектор сегмента данных (#DS) будет использоваться для любого кода компилятора, связанного с данными.
Таким образом, раздел данных (4k-8k) будет иметь #DS по умолчанию для всех операций. За исключением некоторой строчки, где можно использовать ES. Подобно:
mov $0xc00,%eax
addl $0xd, (%eax)
Но я хочу использовать селектор Extra Segment(#ES) для доступа к CustomData. Я бы определил новую запись GDT для ES с различными Base и Limit. лайк:
mov $0x3400,%eax
addl $0xd, %es:(%eax)
Итак, мой вопрос:
Есть ли в GCC какой-либо флаг компилятора x86, который можно использовать для указания компилятору, который использует #ES для доступа к коду раздела CustomData.?
Значит, флаг компилятора, который будет генерировать код, используя #ES для раздела CustomData.
Заранее спасибо!!
2 ответа
Цитирование примера из документации по расширению языка clang
#define GS_RELATIVE __attribute__((address_space(256))) int foo(int GS_RELATIVE *P) { return *P; }
Который компилируется в (на X86-32):
_foo: movl 4(%esp), %eax # load the arg movl %gs:(%eax), %eax # use it with its prefix ret
адресное пространство 256 gs
257 fs
и 258 ss
,
Документы не упоминают es
; компиляторы обычно предполагают, что es
знак равноds
так что они могут свободно встраивать rep movs
или же rep stos
для memcpy / memset, если они решат сделать это на основе параметров настройки. Библиотечные реализации memcpy
или же memset
также может использовать rep stos/movs на некоторых процессорах. Связанный: Почему std::fill(0) медленнее, чем std::fill(1)?
Очевидно, что это действительно низкоуровневый материал, и он имеет смысл, только если вы уже установили базовый адрес GS или FS. (wrfsbase
). Остерегайтесь того, что i386 Linux использует gs
для локального потока в пользовательском пространстве, в то время как x86-64 Linux использует fs
,
Я не знаю таких расширений для gcc, ICC или MSVC.
Ну есть __thread
в GNU C, который будет использовать %gs:
или же %fs:
префиксы в зависимости от целевой платформы. Как работает gcc `__thread`?,
Хотя вопрос заключается в том, чтобы задать опцию, чтобы gcc code-gen использовал префикс es для доступа к пользовательскому разделу, ЕСЛИ вы хотели сделать это в рукописном коде, синтаксис AT&T уже разрешает, например,%es:(%eax).
Обратите внимание, что это может нарушить инструкции rep-string, которые иногда вставляет gcc; fs или gs были бы единственными разумными вариантами, и все еще могли бы использоваться даже в x86-64.
(Создание этого комментария вики сообщества на основе полезной критики Питера Кордеса.)