размер слова по умолчанию в UNIX/Linux

размер слова по умолчанию в UNIX/Linux

Я проверял предварительно обработанный вывод моей программы на языке C и случайно посмотрел на заголовочный файлwordsize.h

Это находится в /usr/include/i386-linux-gnu/bits/wordsize.h

файл содержит только один макрос

#define __WORDSIZE   32

Мой вопрос заключается в следующем: размер слова определяется установленным компилятором или это как-то связано с установленной у меня ОС (32-разрядной или 64-разрядной) или это как-то связано с конфигурацией оборудования моей машины?

Я новичок в разработке под Linux.

решение1

В общемwordsizeопределяется целевой архитектурой при компиляции. Ваш компилятор обычно компилирует с использованием wordsizeдля текущей системы.

Используя gcc(среди прочего) вы также можете настроить это с помощью различных флагов. Например, на 64-битном хосте вы можете скомпилировать для32-битныймашина илисила32-битные слова.

-m32  # int, long and pointer to 32 bits, generates code for i386.
-m64  # int, long and pointer to 64 bits, generates code for x86-64.
-mx32 # int, long and pointer to 32 bits, generates code for x86-64.

Вам также следует взглянуть на limits.hи inttypes.hувидеть использование этого определения.


Для кросс-компиляции проверьтемультибиблиотечный(32-битная ссылка на SO) и поищите в Интернете.

Проверьте, с какими флагами был собран ваш GCC:

gcc -v

Что касается размеров, то они обычно тесно связаны с центральным процессором и сопутствующими ему параметрами – например, максимальным размером адреса памяти, размером регистров ЦП и т. д.

Для быстрого ознакомления вам не обязательно понимать многое из этого, но в зависимости отгде тыэто может дать некоторое представление:

Если вы используете gccи компилируете с этим -Sфлагом, вы также можете посмотреть наРуководство по сборке. Здесь немного запутанно, например, на 32-битной машине слово имеет размер 16 бит, а long — 32 бита. ( __WORDSIZE)

Так, например, movl $123, %eaxозначает длинный ход (32-битный - __WORDSIZE)123 зарегистрироватьсяeax, и movwозначает переместить слово (16 бит).


Это соглашения об именовании, – и только сказать, что это WORDSIZEможет означать больше, чем одно. Вы также можете столкнуться с кодом, где они, например, определяют что-то вроде

#define WORD_SIZE 16

так как все зависит от контекста. Если вы читаете данные из файла или потока, где источник имеет размер слова 16 бит, это будет естественно. Только чтобы указать, что не всегда предполагайте, что размер слова означает, __WORDSIZEкогда читаете его в коде.


Пример с пользовательским определением WORD_SIZEне повлияет на набор инструкций в сгенерированном машинном коде. Для GCC в целом я бы рекомендовалэта книга.(К сожалению, она немного устарела, но пока не нашел похожей, более современной и легкой для чтения книги. (Не то чтобы я искал ее так уж усердно.) Она короткая, лаконичная и приятная. И если только вы будете иметь в виду, что кое-что могло измениться, например, добавились новые функции и т. д., то она все равно станет хорошим введением.)

Он дает быстрое и хорошее введение в различные аспекты компиляции. Посмотрите наглава 11для хорошего объяснения цепочки компиляции.


Я не знаю никаких опций в GCC для компиляции 16-бит. Один из способов сделать это — написать на ассемблере, используя , .code16чтобы указать, что код должен быть 16-битным.

Пример:

    .file "hello.s"
    .text
    .code16            /* Tel GAS to use 16-bit instructions. */
.globl start, _start
start:
_start:
    movb $0x48, %al
        ...

Это необходимо, например, загрузчикам, таким как GRUB и LILO, для кода, присутствующего на MBRвашем жестком диске.

Причина этого в том, что при загрузке компьютера процессор находится в специальном режиме, в котором он поддерживает не 32-битные, а максимум 16-битные инструкции. Реальный режим.

Короче говоря, BIOS выполняет аппаратный тест, затем загружает первые 512 байт вашего загрузочного диска в память и оставляет управление этому коду, начиная с адреса 0. Этот код, в свою очередь, определяет, где находится следующий этап файлов, загружает их в память и продолжает выполнение, наконец, входя Защищенный режимгде у тебя естьнормальный32-битный режим.

решение2

Вот что у меня:

% cat /usr/include/bits/wordsize.h 
/* Determine the wordsize from the preprocessor defines.  */

#if defined __x86_64__
# define __WORDSIZE 64
# define __WORDSIZE_COMPAT32    1
#else
# define __WORDSIZE 32
#endif

Так что это определяется wordsize.h, который идет с вашим компилятором. Но умный выберет подходящий размер.

решение3

У вас должна быть возможность выбрать размер слова по умолчанию во время компиляции, как правило, с помощью одного из параметров -m32или -m64.

/usr/include/i386-linux-gnu/bits/wordsize.hпредназначен для использования при компиляции 32-битных приложений.

Должно быть, /usr/include/x86_64-linux-gnu/bits/wordsize.hсодержащее 64-битное __WORDSIZEопределение.

Это изменение было введено в Ubuntu 11.4:https://wiki.ubuntu.com/MultiarchSpec

Если -m64не получится, возможно, у вас 32-битный дистрибутив. uname -mЯ вам сообщу.

Хотя кросс-компилировать 64-битные двоичные файлы на 32-битной системе можно, это будет неудобно, поскольку у вас не будет простого способа запустить их там.

Если ваш процессор 64-разрядной модели (уточните у lscpu), вам может потребоваться установить 64-разрядный дистрибутив, чтобы иметь возможность легко собирать мультиархитектурные пакеты.

Связанный контент