Все процессоры, которые поддерживают набор инструкций x64 (также известный как x86_64 или amd64), также поддерживают набор инструкций x86 (также известный как i386 или i686, которые являются строго определенными версиями x86). То же самое касается ARM A64 (новый 64-битный набор команд, появившийся в ARMv8) и A32 (название для «классического» 32-битного набора инструкций), для SPARC64 и SPARC , и я верю для MIPS64 и MIPS . Таким образом, во всех этих семействах архитектуры, если процессор может выполнять 64-битный код, он также может запускать 32-битный код.
Ядро Linux поддерживает запуск 32-битного пользовательского кода с 64-битным ядром (я думаю, что во всех упомянутых выше семействах архитектур). Ядро должно быть однородным (все 64-разрядные или все 32-разрядные), и каждый процесс должен быть однородным, но в 64-разрядном ядре может быть смесь 32-разрядных и 64-разрядных процессов. Обратное невозможно: с 32-битным ядром вы не можете запускать 64-битные процессы.
Это выбор дизайна в Linux, мотивированный желанием запустить существующие 32-разрядные двоичные файлы в 64-разрядных установках. Другие варианты Unix сделали другой выбор: Solaris может запускать 64-разрядные программы на 32-разрядном ядре, а также наоборот, в то время как OpenBSD не может запускать 32-разрядные программы на 64-разрядном ядре.
Вы можете получить информацию о процессоре в /proc/cpuinfo
. Если ваш процессор x86 имеет lm
флаг, это 64-битный процессор.
По умолчанию uname -m
или arch
показывает архитектуру, для которой было скомпилировано ядро. Linux может установить «индивидуальность» процесса (с помощью personality
) системного вызова. Вы можете запустить подпроцесс в другой личности с помощью setarch
команды; setarch i686 someprogram
или linux32 someprogram
запускает указанную программу в среде, в которой происходит uname -m
возврат i686
, setarch amd64 someprogram
или linux64 someprogram
запускает указанную программу в среде, в которой uname -m
возвращается amd64
.
file /sbin/init
говорит вам, для какой архитектуры init
скомпилирована программа. Хотя в установке можно смешивать 32-разрядные и 64-разрядные исполняемые файлы, обычно все основные программы ОС имеют одинаковую архитектуру, поскольку ими намного легче управлять.
$HOSTYPE
является переменной bash и сообщает вам, для какой архитектуры bash
была скомпилирована программа.
getconf LONG_BIT
позволяет узнать, настроен ли компилятор C по умолчанию для компиляции 32-битных или 64-битных программ. Более точный тест состоит в том, чтобы скомпилировать и запустить программу, которая печатает sizeof(void*)
или sizeof(size_t)
- вызов getconf
может дать только информацию о том, что getconf
считает компилятором по умолчанию.