Идеология 6502, а именно делать проще, дешевле и лучше, нашла своё продолжение в почти фантастической разработке фирмы Acorn, процессоре ARM-1, выпущенном в 1985, тогда же, когда появилось технологическое чудо фирмы Intel, процессор 80386. ARM состоял из на порядок меньшего числа транзисторов и поэтому потреблял существенно меньше энергии и был при этом в среднем гораздо быстрее. Конечно, у ARM не было никакого MMU и даже операций деления и умножения, поэтому в некоторых расчетах, основанных на делении 80386 мог быть быстрее. Однако достоинства ARM оказались столь велики, что на сегодня это самая массовая процессорная архитектура. Было выпущено более 100 миллиардов таких процессоров.
Разработки ARM в 1983 начались после того, как в фирме Acorn провели исследования с процессором 32016, которые показали, что на многих расчётах 6502 на два раза меньшей рабочей частоте мог быть быстрее этого, как казалось, гораздо более мощного процессора. Тогда уже был доступен 80286, который показывал очень хорошую производительность, но фирма Intel, возможно почувствовав немаленький потенциал небольшой фирмы Acorn, отказалась предоставить свой процессор для тестирования. При этом технология 80286 не была закрытой как 80386 и была передана многим фирмам, поэтому история до сих пор ждёт раскрытия деталей этого несколько необычного отказа. Возможно, если бы Intel разрешила использовать свой процессор, то в Acorn использовали бы именно его, а не стали бы разрабатывать ARM.
ARM разрабатывали всего несколько человек, причем тестировали систему команд, используя бейсик компьютера BBC Micro. Сама разработка проходила в здании бывшего подсобного помещения, которое часто называют сараем или амбаром. Интересно, что одному из главных разработчиков 6502, Биллу Меншу, первому предложили сделать электронику ARM. Но тот сразу понял, что ARM – это конкурент лучшим разработкам крупных фирм и решил не связываться, возможно опасаясь, что в противном случае его компанию WDC ждет судьба компании MOS Technology. Процессор в итоге сделали в компании VLSI. Дебют ARM получился скорее неудачным. В 1986 была выпущена приставка для BBC Micro c названием ARM Evaluation system, содержащей помимо процессора 4 МБ памяти (это очень много для тех лет), что сделало эту приставку очень дорогим изделием (её цена была более 4000 фунтов стерлингов, т.е. примерно 6000 долларов). Конечно, если сравнивать её с компьютерами того времени со сравнимыми по быстродействию возможностями, то приставка оказывалась на порядок или даже почти два дешевле. Но для новой системы было очень мало программ. И это несколько странно, так как вполне было возможно портировать Unix для этой системы – тогда были доступны многочисленные варианты Unix, которые не требовали MMU, были варианты Unix для PDP-11, 68000, 80186 и даже 8088. Любопытно, что в 90-е для Acorn Archimedes был портирован Linux. Возможно задержка с появлением настоящего Unix для ARM была вызвана нежеланием Acorn передавать технологию ARM другим фирмам.
Первая система на базе ARM
Несколько неудачная маркетинговая политика Acorn привела фирму к 1985 к очень тяжелому финансовому положению. Acorn помимо ARM пыталась ещё вести дорогостоящую разработку компьютеров для бизнеса, которая провалилась, в частности, из-за недостатков выбранного для них процессора 32016. Не слишком удачным оказался также и компьютер Acorn Communicator. Разработка сравнительно удачного, но не совсем IBM PC совместимого компьютера Master 512, была весьма затратной. Кроме того, много финансовых ресурсов было потрачено в безрезультатной попытке выйти на рынок США, на который возможно в рамках гипотетической большой игры по поглощению самой Acorn была допущена итальянская фирма Olivetti со своими довольно удачными, основанными на Intel 8086 и 80286, компьютерами. Кстати, после поглощения Acorn, роль Olivetti на американском рынке довольно быстро сошла на нет.
Уже как часть Olivetti Acorn разработала улучшенный чип ARM2 со встроенными командами умножения, на основе которого был сделан потрясающий тогда своим быстродействием персональный компьютер Archimedes, первые модели которого стали доступны в 1987. Однако, менежмент из Olivetti был ориентирован на работу с IBM PC совместимыми компьютерами и не желал использовать свои ресурсы для реализации продукции Acorn. Также удивительно, что Архимеды не пришли на смену BBC Micro в английских школах. Возможно это случилось из-за несостоявшейся сделки с СССР по компьютерам Memotech MTX. Memotech взяла миллион фунтов стерлингов у английского правительства, а после срыва сделки объявила себя банкротом. После этого правительство прекратило практику поддержки своих производителей компьютерной техники, включая Acorn.
ARM предоставляет для использования 16 32-разрядных регистров (их реально больше, если учитывать регистры для системных нужд). Один из регистров, R15 (или PC), подобно архитектуре PDP-11 является счётчиком команд. Почти все операции выполняются за 1 такт. Больше тактов нужно, в частности, для переходов, умножений и обращений к памяти. По сравнению, с основными процессорами тех лет ARM отличало отсутствие такой типовой структуры как стек. Стек реализуется, если необходимо, через один из регистров (хотя стандартным для стека считается R13 или SP). При вызове подпрограмм стек не используется, вместо этого адрес возврата сохраняется в выделенном для него регистре R14 или LR (link register). Такая схема, очевидно не работает для вложенных вызовов, для которых приходится организовывать стек. Уникальная особенность ARM – в совмещении счётчика команд, который 26-разрядный, т. е. позволяющий адресовать до 64 МБ, с регистром состояний. Для флагов в этом совмещенном регистре выделяется восемь бит, ещё два добавочных бита в этом регистре получаются за счёт того, что младшие два бита адреса не используются, так как коды должны быть выровнены по границе 4-байтного слова. Процессор может обращаться к байтам и 4-байтным словам, к 16-битным данным он напрямую обращаться не может. Инструкции для работы с данными у ARM 3-адресные. Характерной особенностью архитектуры RISC является использование команд типа регистр-память только для загрузки и выгрузки данных. ARM имеет встроенный быстрый битовый сдвигатель (Barrel Shifter), позволяющий без затрат тактов сдвигать значение одного из регистров в команде на любое число раз. Например, умножение значения регистра R0 на 65 c помещением результата в регистр R1 можно записать одной однотактовой командой сложения ADD R1, R0, R0 shl 6
, а умножение на 63 – командой RSB R1, R0, R0 shl 6
. Битовый сдвигатель позволяет помимо знаковых и беззнаковых сдвигов влево или вправо делать также вращения и даже вращение через перенос. В системе команд есть обратное вычитание, что позволяет, в частности, иметь унарный минус как частный случай этой команды и ускорить процедуру деления. Несколько инструкций скорее очень необычны и их полезность сомнительна, например, есть инструкция CMN, которая складывает аргументы, но результат сложения пропадает – эта команда используется только для установки флагов. Есть ещё подобная инструкция TEQ, в которой вместо обычного сложения используется сложение по модулю 2 (XOR). Некоторый смысл этим инструкциям придаёт только то, что они фактически расширяют очень ограниченный диапазон констант для использования в операциях сравнения. Кроме того, TEQ можно использовать для сравнений, которые не меняют флаги C и V и для прямой установки всех 8 флагов. Помимо RSB, ARM имеет ещё одну уникальную особенность: все его инструкции условные. Имеется 16 случаев (комбинаций флагов), которые присоединяются к каждой инструкции. Инструкция выполняется, только в случае, если текущий набор флагов соответствует набору в этой инструкции. В процессорах других архитектур подобное исполнение имеет место, как правило, только для условных переходов. Эта особенность ARM позволяет во многих случаях избегать медленной операции переход. Последнему также способствует то, что при выполнении арифметических операций можно отказаться от установки флагов состояния. С ARM подобно процессору 6809 можно использовать как быстрые, так и обычные аппаратные прерывания. При обычном прерывании два регистра (R13, R14) заменяются на системные. При быстром прерывании заменяются уже 7 регистров (R8-R14). Это позволяет сделать обработчики прерываний более компактными и быстрыми. В режиме супервизора регистры R13 и R14 также заменяются. Таким образом, в ARM реально используются 27 регистров. Максимальная задержка при вызове аппаратного прерывания небольшая, главный тормоз том, что команды блочного копирования (до 18 тактов) прерываться не могут. Для вызова программных прерываний есть специальная команда SWI, она переключает процессор в режим супервизора.
Система инструкций ARM содержит существенно меньше базовых команд, чем система инструкций процессоров x86. Но сами инструкции у ARM очень гибкие и мощные. Несколько очень удобных и мощных инструкций ARM не имеют аналогов для 80386, например, RSB (уже упомянутое обратное вычитание), BIC (AND с инвертированием, такая команда есть у PDP-11), 4-адресная MLA (умножение с суммированием), LDM и STM (загрузка или выгрузка множества регистров из памяти, похожи на команду MOVEM для процессоров 68k). Почти все инструкции ARM 3-адресные, а почти все инструкции 80386 имеют не более 2 операндов. Система команд ARM более ортогональна – все регистры взаимозаменяемы, некоторое исключение составляют только регистры R14 и R15. Большинство команд ARM могут потребовать 3-4 команды 80386 для своей эмуляции, а большинство команд 80386 можно проэмулировать 2-3 командами ARM. Интересно, что эмулятор IBM PC XT на аппаратуре компьютера Acorn Archimedes с процессором на 8 МГц работает даже быстрее, чем реальный компьютер PC XT. На компьютере Commodore Amiga с процессором 68000 на 7 МГц эмулятор может работать только со скоростью, не большей 10-15% реального PC XT. Очень интересно также, что первые компьютеры NeXT с 25 МГц 68030 показывали производительность целочисленных расчетов на уровне того же 8 МГц ARM. Apple собиралась в проекте Möbius сделать компьютер-преемник Apple ][, но когда выяснилось, что прототип этого компьютера в режиме эмуляции обгоняет не только Apple ][, но и основанные на 68k процессорах Макинтоши, проект закрыли!
Среди недостатков ARM можно выделить проблему загрузки константы в регистр. Можно загружать только 8 разрядов за один раз, хотя при этом константу можно инвертировать и сдвигать. Поэтому загрузка полной 32-разрядной константы может занять до 4 команд. Можно, конечно, загрузить константу из памяти одной командой, но тут возникает проблема указания адреса этой величины, так как смещение может быть только 12-разрядным. Другой недостаток ARM в относительно невысокой плотности кодов, что делает программы несколько большими, а главное снижает эффективность работы процессорного кэша. Однако, это возможно было скорее следствием невысокого качества компиляторов для этой платформы. Инструкции умножения позволяют получить только младшие 32-разряда результата. Долгое время существенным недостатком ARM было отсутствие встроенной поддержки управления памятью (MMU) – этой поддержки, например, требовала Apple в начале 90-х. Сопроцессоры для работы с вещественными числами для архитектуры ARM также стали использоваться с существенной задержкой. У ARM не было таких продвинутых средств для отладки, какие были у архитектуры x86. Есть ещё некоторая странность в языке стандартного ассемблера для ARM: операции для битового сдвигателя принято писать через запятую. Таким образом, вместо простой формы R1 shl 7
– сдвинуть содержимое регистра R1 на 7 бит влево – нужно писать R1, shl 7
.
С 1989 стал доступен ARM3 с встроенным кэшем, у которого появилась ещё интересная команда SWP для атомарного обмена данных между регистрами и памятью. В 1990 команда разработчиков ARM отделилась от Acorn и создала с помощью Apple и VLSI компанию ARM Holdings. Одной из причин отделения стала слишком большая затратность разработки ARM по мнению менежмента Acorn-Olivetti. Впоследствии Acorn прекратила своё самостоятельное существование, а ARM Holdings превратилась в крупную компанию. Однако, разделение Acorn и ARM Holdings было также инициировано желанием Apple иметь процессор ARM в своем компьютере Newton и не зависить от другого производителя компьютеров. Кстати, в 1999 VLSI утратила самостоятельность, став частью Philips.
В 1991 ARM Holdings выпустил ARM6, который начал новую линейку процессоров, которые стали прообразами тех, что широко используются до сих. В нём реализована поддержка виртуальной памяти, произведен переход на 32-битную адресацию и добавлен ещё ряд новых возможностей. Историю же классических процессоров ARM завершил ARM250, выпущенный в 1992. Это фактически ARM3 без кэша, но интегрированный на одном чипе с некоторыми базовыми чипами Acorn Archimedes. Подобное интегрирование стало в дальнешем одной из типичных особенностей архитектуры ARM. Другая особенность этой архитектуры в путающем наименовании процессоров и архитектур, например, ARM6 – это процессор архитектуры ARMv3, а ARM3 и ARM250 – это процессоры архитектуры ARMv2.
ARM показывал производительность на целочисленных данных, превосходящую 80486 на той же частоте на 10-20%! Intel смогла достичь преимущества использованием технологии умножения тактовой частоты и затем крепко закрепить его с процессором Pentium. DEC StrongARM смог ненадолго вернуть себе лидерство в 1996, после чего эта технология была куплена Intel, которая с тех пор является крупным производителем процессоров ARM-архитектуры. Таким образом, существует несколько центров развития этой архитектуры.
Дальнейшее развитие архитектуры ARM также весьма любопытно, но это уже другая история. Хотя можно упомянуть, что именно благодаря доле в ARM Holdings Apple в 90-е смогла избежать банкротства, а в 2022 Apple вообще начала переход на архитектуру ARM!
Cтатья опубликована на geektimes, а также переведена на английский.