Хелпикс

Главная

Контакты

Случайная статья





Микропрограммирование



Микропрограммирование

Микропрограммирование относится к довольно сложным темам; его можно описать точно и строго на уровне электрических сигналов, триггеров, т.е. всего того, что относится к цифровой электронике. Можно же выбрать иной путь – описать его функционально, т.е. как совокупность взаимодействующих элементов, но без углубления в технические детали. Именно этим путем я и решил последовать.

Некоторым аналогом микрокода является механическое пианино, в котором нажатия клавиш управляются путем считывания сигналов, записанных на перфорированной ленте илибарабане. Пианино выступает исполнителем программы, записанной на ленте или барабане. Изменяя последние, мы изменяем программу механического пианино и, следовательно, извлекаемые им звуки.

Сама идея микрокода витала, что называется, в воздухе. Еще в 1947 году при проектировании компьютера MIT Whirlwind была предложена управляющая контрольная матрица: двумерная диодная решетка, синхронизируемая импульсами от внутренних часов ЦПУ. Однако это была лишь начальная и робкая попытка, не доведенная до логического завершения. Кроме того, развитию этой идеи препятствовал недостаточный уровень развития электроники. В июле 1951-го Уилкс сделал первое сообщение на конференции вМанчестерском университете, а окончательное решение было оформлено им в статье (в соавторстве с Дж. Стрингером), опубликованной в апреле 1953 года. Еще через несколько лет микропрограммное управление было наконец реализовано.

Микрокод занимает промежуточное положение между аппаратурой (hardware) и программным обеспечением (software). Часто микрокод называют

«прошивкой» (firmware); это объясняется тем, что микрокод тем или иным образом фиксируют (прошивают) в микросхемах энергонезависимых ПЗУ.

 

Для начала давайте выясним, а зачем вообще нужен микрокод, неужели без него нельзя обойтись? Можно, конечно, но все не так просто.

В первых компьютерах каждой выполняемой ими операции соответствовал отдельный компонент электронной схемы. Если на исполнение поступала какая-то команда, то происходило примерно следующее:

Выделялся код операции (например, сложение, переход, сдвиг и т.д.).

По выделенному коду операции выбиралась та часть электронной схемы, которая отвечала именно этой операции (т.е. для сложения выбиралась часть схемы, ответственная за сложение, для перехода – часть схемы, ответственная за переход и проч.).

Операция осуществлялась, и компьютер переходил к обработке следующей операции.

Мы опускаем такие «мелочи», как выборка и запись операндов из памяти и в память, обращение к внешним устройствам, обработка прерываний, синхронизация импульсов и т.д.

Таким образом, каждой операции соответствовала какая-то часть электронной схемы, которая активировалась при исполнении операции. Для добавления новых операций или изменения существующих в компьютер требовалось внести большие изменения: доработать (или полностью переработать) электрическую схему, изготовить новые платы, напаять

компоненты, протестировать систему в целом. Если конструкторы где-то ошибались (а это, как понимаете, было нетрудно), то все приходилось

переделывать. Схемы управления, управляющие потоками сигналов, были жесткими и трудно поддающимися изменениям.

Легко видеть, что при таком подходе компьютеры просто не могли не быть дорогими, громоздкими и ненадежными. Неудивительно, что компьютеры занимали целые шкафы: где же еще можно было разместить такое количество плат и соединительных проводов! Каждому из них требовались специальное помещение и целый штат обслуживающего персонала. Нужно было что-то делать. Решение, предложенное Уилксом, оказалось выходом из технологического тупика.

Прежде всего конструкторы (а еще раньше – математики) обнаружили, что все возможные операции, исполняемые компьютерами, можно свести (редуцировать) к относительно небольшому числу базовых элементарных операций. Вот несколько примеров:

Сложение двух положительных чисел x+y можно представить как прибавление к числу x стольких единиц, сколько их содержится в числе y:

Так, относительно сложная операция сложения сводится к более простым – инкременту и декременту.

Вычитание x-y, это уже знакомая операция сложения, в которой операнд y берется с противоположным знаком.

Само изменение знака числа достигается совсем просто:

y = (~y) + 1

где «~»– логическая операция отрицания (замена 0 на 1 и обратно).

Копирование данных из одной ячейки памяти (x) в другую (y) очень похоже на сложение:

x = 0

while (y != 0) {

x++;

y--;

}

Здесь видно, что нужна еще одна элементарная операция – обнуление (стирание) содержимого ячейки памяти.

Переход (условный или безусловный), а также вызов подпрограммы сводятся к изменению содержимого счетчика команд.

Правильно комбинируя такие элементарные (базовые) операции, можно было существенно упростить процессор. Оставалось придумать, как именно автоматизировать процесс комбинирования, как организовать правильное функционирование базовых компонентов так, чтобы они могли реализовать любую из команд компьютера. Как решить проблему их коммутации?

Вот тут на сцене и появляется микрокод.

В сущности, микрокод – это управляющая программа, которая описывает, как, в каком порядке и с какими параметрами следует вызывать базовые операции. Изменяя микрокод, мы изменяем и систему команд компьютера. Если нужно изменить архитектуру машины, не меняя основных составляющих, то достаточно изменить эту управляющую программу.

Практически все сколько-нибудь сложные устройства (компьютеры, внешние устройства, фотоаппараты, сотовые телефоны и т.д.) оснащены процессорами, действующими по принципу микропрограммирования.

Любая операция процессора – это набор (совокупность) нескольких микрокоманд, прошитых в ПЗУ процессора. Для того чтобы изменить «поведение» процессора, нужно изменить его микропрограмму.

М.Уилкс предложил рассматривать микрокод как двумерную таблицу (матрицу). Столбцы матрицы соединятся проводниками с линиями управления процессором, а строки представляют собой микрокоманды (микроинструкции), т.е. битовые (двоичные) последовательности, описывающие исполнение той или иной операции. Каждая микрокоманда исполняется за один такт. Единица, как обычно, означает, что данный бит включен, а нуль – то, что этот бит выключен. Таким образом, процессор – это автомат, управляемый микрокодом (сравните с механическим пианино, о котором мы говорили ранее). Логика управления реализуется не в виде электронной схемы, а в виде хранимых в ПЗУ микрокоманд (предписаний).

Если вы смотрели старые фильмы, то, возможно, видели, как на старинных телефонных станциях операторы коммутировали абонентов с помощью штекеров между собой. Микропрограммирование до определенной степени напоминает эту коммутацию, только вместо операторов-барышень используются специальные микросхемы, выделяющие из инструкций, подлежащих исполнению, всю необходимую информацию (код, операнды, режимы адресации и проч.).

Каждой обычной операции процессора (такой, например, как сложение двух чисел, сдвиг, очистка ячейки памяти, переход и т.д.) соответствует определенная комбинация сигналов, передаваемых в процессор по линиям управления.

Сами микрокоманды выглядят весьма непривычно. Их большая часть – это указания о том, как нужно соединить или разорвать соединение тех или иных частей электронной схемы процессора, пересылка данных, запись констант и логические операции. Это и неудивительно, т.к., скажем, операция передачи управления по условию (условный переход) требует прежде всего анализа состояний определенных внутренних регистров и только потом присвоения счетчику команд определенного значения – адреса перехода.

Каждому из этих управляющих сигналов соответствует определенная последовательность двоичных разрядов (микрокоманда). Каждый из разрядов в микрокоманде может быть 0или 1. Их комбинации управляют схемами внутри процессора. Эти схемы внутри процессора и образуют те самые базовые (элементарные) операции, о которых мы говорили ранее. Все операции выборки микрокоманды, передачи управляющих сигналов в процессор, работа схем процессора строго синхронизированы, но это уже область компетенции специалистов по электронике.

Набор микрокоманд образует микропрограмму. Итак, микропрограмма, состоящая из микрокоманд, эмулирует на «железе» процессора операции, составляющие его систему команд.

Довольно долгое время после того, как М.Уилкс обосновал и ввел в практику микропрограммирование, последнее рассматривалось как теоретически интересный, но практически мало осуществимый способ построения компьютеров. Основная причина – недостаточный уровень элементной базы тех лет.

 

Но к началу 60-х годов прошлого века ситуация кардинально изменилась: транзисторы стали так дешевы и надежны, что появилась возможность полной перестройки элементной базы компьютеров (т.н. третье поколение компьютеров). Корпорация IBM приняла решение о создании новой линейки программно-совместимых (от младших моделей к старшим) компьютеров – той самой IBM-360. И вот тут микропрограммирование оказалось решающим фактором. Хотя отдельные модели линейки имели отличающиеся центральные процессоры, все они были способны исполнять один и тот же набор операций.

Эта совместимость различных процессоров была достигнута именно благодаря микропрограммированию, и с тех пор (т.е. уже более 50 лет) история развития процессоров – это история микрокодов.


 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.