Найти в Дзене
Василий Волченко

На пути к "продвинутому пользователю": архитектуры процессоров с точки зрения программного кода

Оглавление
Эта заметка не нужна программистам и системным администраторам, особенно средних лет - они и так отлично всё знают, и будут просто искать неточности, которые никому не нужны. Эта заметка не нужна простым пользователям, не стремящимся стать "продвинутыми" - тут полно ненужной информации, которую трудно понять; она не поможет "установить приложение с официального сайта в один клик" (или из официального репозитория).
Эта заметка не нужна программистам и системным администраторам, особенно средних лет - они и так отлично всё знают, и будут просто искать неточности, которые никому не нужны. Эта заметка не нужна простым пользователям, не стремящимся стать "продвинутыми" - тут полно ненужной информации, которую трудно понять; она не поможет "установить приложение с официального сайта в один клик" (или из официального репозитория).

Итак, архитектура процессора. Казалось бы, кто этого не знает? Кто-то с гордостью скажет "У меня Core i7, новый, 6 ядер" - и это тоже будет относиться к архитектуре. Кто-то копнёт поглубже, говоря о размере кеша, о количестве команд за такт, о конвейере команд и т.п. Но речь сейчас не совсем об этом. Это нужно знать, чтобы предсказать производительность процессора (наряду с частотой), подумать о проблемах с оптимизацией.

А нам часто надо понять, запустится ли загружаемая программа на данном ПК (и под данной операционной системой, если это не сама операционная система!), а среди программ в Windows, а особенно - в Linux - есть весьма много обозначений архитектур, которые могут слегка смутить человека, только начинающего разбираться с архитектурами. Да, кто-то может отослать человека к истории процессоров, и знать её правильно - но история - это история, а нам надо решить такой, казалось бы, простой вопрос: пойдёт ли это на данном ПК или нет. Иногда вопрос становится посложнее: нужны ли эти средства разработки (например, ассемблер, компоновщик), чтобы программа полноценно собралась из исходных кодов (да, "привет Linux" и основной способ распространения программ GPL).

Тем не менее, большинство пользователей знают, что у них 64-разрядная (или 32-разрядная) система, так что примерно представляют, что и для чего качать... Но периодически на форумах возникает "странный" вопрос: "Что качать: AMD64 или ARM64? А если у меня Intel?"

Итак, давайте договоримся: пока будем говорить только о ПК, ноутбуках и Windows-планшетах (не RT). Всяческие телефоны, андроид-планшеты (не путать с Windows), хромобуки, Raspbery Pi и им подобное оставим вне рассмотрения. Экзотику ARM-BIOS - тоже. Так что, увидев в "архитектуре" буквы "ARM", отбрасываем это для вышеперечисленных устройств. Также не будем рассматривать компьютеры Apple - это отдельная экосистема, пусть и с возможностью установки и запуска Windows.

Что значит "архитектура" с точки зрения программного кода? Чаще всего её обозначают названием процессора (или целой группы процессоров), но, благодаря обратной совместимости, более новые процессоры могут запустить программы, рассчитанные на старую архитектуру - при условии, что ОС это позволит.

Ну что же, начнём с начала. С давних времён, которые, как ни странно, остаются актуальными.

i8086 (8086, 86, иногда пишут DOS или DOS16)

Древний процессор Intel (аж с 1978 года!), однако обратная совместимость заставляет "тащить" его систему команд вплоть до самых современных процессоров. Так что да, Core i7 9-й серии и Ryzen 2xxx при определённых условиях способны запустить программы под эту архитектуру. Кто-то спросит, зачем это надо. На самом деле, здесь речь не столько о поддержке старой системы команд, сколько о древнем, казалось бы, уже устаревшем реальном режиме работы процессора (16-разрядном, а также режим "виртуального 86" уже на уровне 386 и выше), так что программы, откомпилированные под этот режим, будут маркировать именно такой архитектурой. И трансляторы, генерирующие такой код, будут маркироваться именно так. Где это можно встретить?

1. DOS и некоторые приложения под DOS. Да, кто учился в ВУЗе 20 лет назад и более, но до этого не "фанател" от компьютеров, воспринимает DOS как "ругательство" с непонятной системой команд. Кто посерьёзнее - понимал, что это кое-где может пригодиться. Впрочем, система команд DOS актуальна и сейчас - достаточно запустить cmd в Windows , но речь не об этом. А вот с самими программами под DOS несколько сложнее. Да, даже современные версии Windows (только 32-разрядные, x86) позволят запускать отдельные, простейшие программы под DOS, но это не особо актуально. Может быть, удастся запустить простой DOS на современном компьютере, но толку с того будет мало: большинство современных разделов жёсткого диска будут не видны. Под Linux запуск DOS-приложений, собственно, и не был предусмотрен (без эмулятора, разумеется, с эмулятором и сейчас не проблема всё это запустить). Следует помнить, что многие более поздние программы, будучи программами DOS, имели всего лишь 16-битный загрузчик, а грузили уже 32-разрядный "расширитель". Интерес могут представлять отдельные старые программы и игры.

2. Более актуально то, что BIOS (который до сих пор актуален на старых материнских платах, а на полноценных новых UEFI умеет работать в режиме эмуляции BIOS) передаёт управление загрузчику именно в 16-битный реальный режим. Как следствие, если Вы пишете код (что вряд ли) или собираете загрузчик (например, GRUB) для BIOS, Вам потребуются инструменты i8086.

i80386 (80386, 386, i386)

Тоже довольно древний процессор (1985 года выпуска). Однако его архитектура до сих пор представляет интерес. Иногда некоторые программы до сих пор маркируют i386, потому что именно он положил начало 32-разрядной архитектуре Intel. Это значит, что программа, архитектура которой маркирована "i386", запустится в любой 32-разрядной операционной системе (если она совместима с той, под которую собрали, и имеются все нужные зависимости). Более того, в большинстве случаев такие прикладные программы запустятся и под 64-разрядной операционной системой (об этом позже). Поэтому длительное время разработчики "не заморачивались" и в графе "архитектура" писали "i386", хотя уже во всю работали Pentium 3. Доходило до того, что указывали архитектуру "i386", а в требованиях - ММХ (которого на момент выпуска 386-го не было и в мыслях). Но - сугубо формально - если указана архитектура "i386", то программа (или операционная система) должна запуститься на настоящем i80386. Понятное дело, что процессоры AMD (начиная с тех же самых Am386) тоже отлично поддерживают эту архитектуру.

i586

Довольно редкое обозначение архитектуры. Начнём с того, что процессора с таким обозначением не было и нет. Понятно, что, в конце концов, процессор i386 стал неактуален, программы собирали под процессоры не ниже Pentium, стало быть, на 80386 их запустить никак не удастся. Обозначение вводили в некоторых дистрибутивах Linux. Теоретически, программа и ОС, маркированная таким образом, запустится на любом процессоре Intel, начиная с Pentium, а на AMD, начиная с К5 (есть нюансы, так что лучше - начиная с К6). Так что, если у Вас не такая древность, программа запустится (с учётом программной совместимости с ОС и зависимостей).

i686

Это уже следующее поколение процессоров (опять же, именно таких процессоров не было), начиная с Pentium II (на самом деле, это поколение начинается с Pentum Pro, но по факту настоящее распространение получил именно Pentium II, так что не факт, что такие программы запустятся под Pentium Pro). Хотя всё это - уже древность. Понятно, что в таком процессоре есть ряд инструкций, недоступных для i586, но имеющихся в Pentium II и выше. Многие дистрибутивы Linux какое-то время собирались именно для такой архитектуры. Если у Вас старый компьютер Intel, то, скорее всего, Вы запустите на нём такую программу или ОС (на новом - тем более при условии совместимости, при запуске старых ОС нужно понимать аппаратную несовместимость и отсутствие драйверов оборудования). Неинтеловские процессоры - с этим чуть хуже. Теоретически, K6-II и K6-III поддерживали много функций от Pentium II, но кое-чего им не хватало, поэтому уровень их совместимости ставили i586. Аналогично - VIA C3 и ему подобные. Впрочем, даже такая древность была способна загружать Windows вплоть до "висты" (а то и "семёрку", вот 8.1 они не запускали, проверено).

x86 (IA32, Intel32, реже - х32)

Общее обозначение 32-разрядных программ, в настоящее время актуально. Конкретные требования надо читать отдельно, может быть достаточно i386, а может не работать и под первыми сериями Core. Слова "Intel" не надо бояться AMD-шникам: архитектура вполне совместимая, но о конкретном уровне совместимости должно быть написано отдельно. Обычно проблема бывает в поддержке конкретной версии SSE, это должно быть указано в сопроводительной документации. AMD отстаёт от Intel в поддержке SSE, но не очень сильно. В большинстве случаев на настоящее время достаточный уровень совместимости для AMD - Athlon-II (Phenom-II), в перспективе - FX; под Intel пока, как правило, хватает последних Pentium 4 Dual Core. Разумеется, речь не идёт о достаточной производительности - просто о возможности запуска и использования всех функций.

Под 64-разрядной ОС в большинстве случаев запустится программа x86 (опять же, при соблюдении всех зависимостей), но не драйвер.

32-разрядная ОС Windows имеет возможность запуска 16-разрядных приложений (DOS, Win16).

Название x32 употреблять не рекомендуется (во избежание путаницы со следующим пунктом), но его используют, когда говорят об UEFI.

X32 EABI

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

На практике этот режим "не прижился", поскольку под него не было "экосистемы", а аналогичные возможности (за редким исключением) есть у x86. Были лишь некоторые сборки Linux с такой поддержкой. Сейчас не актуально.

IA64

Не путать с x86_64. Достаточная редкость и "неудача" Intel. Эта архитектура использовалась в серверных процессорах Itanium, которые уже утратили актуальность. На обычные ПК не устанавливались. Если увидите программу с таким обозначением - она Вам не нужна (если Вы - не администратор такого вот сервера).

x86_64 (x64, AMD64, реже - EM64T, Intel64)

Не путать с IA64. Обычная на сегодняшний день архитектура 64-разрядных систем. Для большинства ПК и мощных ноутбуков актуальны именно такие ОС, запускающие приложения этой архитектуры, а также архитектуры x86 (но не 8086, эти не запустить без эмулятора; впрочем, под Linux wine умудрялся как-то запускать в 64-разрядной ОС приложения Win16). Драйвера x86 в подавляющем случае не поддерживаются ни в Windows, ни в Linux. Был случай удачного "проброса" кода отдельного драйвера из x86 в "прослойку" драйвера x86_64, но это - исключение, к тому же под Linux (linmodem). Прикладные программы х86, наоборот, работают отлично - вплоть до того, что у меня был опыт на заре Athlon64 запуска всей ОС с архитектурой i586 на ядре, специально собранном под AMD64. Не работал только ТВ-тюнер, но это - аппаратные проблемы.

Что касается названия. Изначальное название архитектуры - AMD64, так её иногда и называют, потому что впервые её ввела именно компания AMD. Но и у Intel вскоре появилась такая же архитектура (правда, уже названная EM64T), так что запуск приложений и ОС, помеченных "AMD64", на сколь бы то ни было современных Intel (начиная где-то с "середины" линейки Pentium 4) проблем не вызывает. Хотя слово AMD. Многие (кроме "топовых") популярные планшеты и "планшетоноутбуки" на Intel Atom формально поддерживают такую архитектуру, но и UEFI, и предустановленная ОС у них - 32-разрядная, поэтому про Windows x64 можно забыть (а вместе с ним - Linux-подсистема и ряд программ, в т.ч. и все современные игры - но их бы не удалось нормально использовать из-за памяти и графики). А вот 64-разрядный Linux под ними запускается (хотя и не всегда правильно работает со всем "железом") - ему без разницы, какая разрядность у UEFI. Эмуляции BIOS, к сожалению, у таких планшетов нет, а сторонние средства пока отсутствуют.

Итого на современном ПК, если у Вас есть прикладная программа, архитектура которой помечена:

i8086 (и эквивалентно) - запустить, может, и можно, но проблематично. Под 64-разрядной ОС - только через эмуляцию.

i386, i586, i686, x86, - можно запустить, но нужно смотреть совместимость, зависимости и конкретные требования.

x86_64 = АМD64 - можно запустить только под 64-разрядной ОС (также нужно смотреть зависимости и конкретные требования).

Если у нас драйвер - его архитектура должна совпадать с ОС.

Если у нас системное ПО:

i8086 - теоретически, можно запустить, если у нас BIOS или его эмуляция, но зачем (если речь не идёт о первой стадии загрузчика).

i386, i586, i686, x86 - можно запустить, если у нас BIOS или UEFI x32 (в последнем случае - только для отдельных ОС, Windows 8+ и Linux).

x86_64 = AMD64 - можно запустить, если у нас BIOS или UEFI x64, а если ОС - Linux, то и UEFI x32.