Что такое опция компилятора 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 gs257 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.

(Создание этого комментария вики сообщества на основе полезной критики Питера Кордеса.)

Другие вопросы по тегам