Все процессоры, которые поддерживают набор инструкций 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считает компилятором по умолчанию.