Выход из uname
:
root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux
Однако /sbin/init
исполняемый файл отображается как 32-разрядный:
root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
Другие аспекты системы, кажется, также противоречат вещам:
root@debian:~ # echo $HOSTTYPE
i486
root@debian:~ # getconf LONG_BIT
32
linux
64bit
32bit
cpu-architecture
kiiwii
источник
источник
Все процессоры, которые поддерживают набор инструкций 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
считает компилятором по умолчанию.источник