Усі процесори, які підтримують набір інструкцій 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-бітні), і кожен процес повинен бути однорідним, але ви можете мати суміш 32-бітних та 64-бітних процесів на 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
вважає компілятором за замовчуванням.