Часть 4

Тема 2.1 Архитектурные особенности модели микропроцессорной системы.

Упрощенная архитектура типовой микро-ЭВМ. Рассмотрим упрощенную схему типовой микроЭВМ.  

Основные регистры процессора   Регистры – это ячейки внутренней быстродействующей памяти микропроцессора. Они используются для временного хранения единицы информации (машинного слова) при прохождении данных через блок микропроцессора. В реальных микропроцессорах количество регистров может быть разным. Количество допустимой в системе оперативной памяти определяется регистром адреса. Количество регистров в реальных микропроцессорах может отличаться, но 8 типов регистров присутствуют всегда:   1.      Аккумулятор – является промежуточной памятью при выполнении арифметических и логических операций в АЛУ. Любая из операций  над двумя байтами предполагает размещение одного из них в аккумуляторе. Результат обычно помещается туда же. Может использоваться для изменения (инвертирования, сдвига). Доступен программисту. 2.      Буферные регистры -  используются для накопления исходных данных с шины. Недоступны. 3.      Регистр состояния – каждый разряд этого регистра устанавливается в 0 или 1, если происходит определенное событие. Например, в результате получился 0 или отрицательное число. Доступен для просмотра и из команд. 4.      Счетчик команд – содержит адрес ячейки памяти, в которой содержится следующая команда программы. Недоступен.5.      Регистр команд – содержит команду, которую нужно выполнять на определенном шаге. Недоступен. 6.      Регистр адреса – содержит адрес той команды программы, которая выполняется сейчас. Недоступен. 7.      Указатель стека – содержит адрес вершины стека. 8.      Регистры общего назначения – доступны программисту и предназначены для временного хранения данных.  Процессоры «Мозгом» компьютера является центральный процессор (CPUCentral Processing Unit). Он выбирает из памяти команды и выполняет их. Обычный цикл работы центрального процессора выглядит так: он читает первую команду из памяти, деко­дирует ее для определения ее типа и операндов, выполняет команду, затем считы­вает, декодирует и выполняет последующие команды. Для каждого центрального процессора существует набор команд, который он в состоянии выполнить. Например, процессор Pentium не может обработать программы, написанные для SPARC, а процессор SPARC не может выполнить программы, написанные для Pentium. Поскольку доступ к памяти для получения команд или наборов данных занимает намного больше времени, чем выполнение этих команд, все центральные процессоры содержат внутренние регистры для хра­нения ключевых переменных и временных результатов. Кроме основных регистров, используемых для хранения переменных и времен­ных результатов, большинство компьютеров имеет несколько специальных регис­тров, видимых для программиста. Один из них называется счетчиком команд (PC, program counter), в нем содержится адрес следующей, стоящей в очереди на выполнение команды. После того как команда выбрана из памяти, регистр команд корректируется и указатель переходит к следующей команде. Еще один регистр процессора называется указателем стека (SP, stack pointer). Он содержит адрес вершины стека в памяти. Стек содержит по одному фрейму (области данных) для каждой процедуры, которая уже начала выполняться, но еще не закончена. В стековом фрейме процедуры хранятся ее входные параметры, а так­же локальные и временные переменные, не хранящиеся в регистрах.Следующий регистр называется PSW (Processor Status Wordслово состоя­ния процессора). Этот регистр содержит биты кода состояний, которые задаются командами сравнения, приоритетом центрального процессора, режимом (пользова­тельский или режим ядра), и другую служебную информацию. Операционная система должна знать все обо всех регистрах. При временном мультиплексировании центрального процессора операционная система часто ос­танавливает работающую программу для запуска (или перезапуска) другой. Каж­дый раз при таком прерывании операционная система должна сохранять все реги­стры процессора, чтобы позже, когда программа продолжит свою работу, их можно было восстановить. В целях улучшения характеристик центральных процессоров их разработчики давно отказались от простой модели, в которой за один такт может быть считана, декодирована и выполнена только одна команда. Многие современные CPU обла­дают возможностями выполнения нескольких команд одновременно. Например, у процессора могут быть раздельные модули, занимающиеся выборкой, декодиро­ванием и выполнением команд, и во время выполнения команды с номером п он может декодировать команду с номером n + 1 и считывать команду с номером п + 2. Подобная организация процесса называется конвейером, три его стадии продемон­стрированы на рис. а. Часто встречаются и более длинные конвейеры. В боль­шинстве конвейерных конструкций считанная команда должна быть выполнена, даже если в предыдущей команде был принят условный переход.

Рис. Конвейер с тремя стадиями (а), суперскалярный процессор (б)
Более передовым по сравнению с конвейерной конструкцией является суперскалярный центральный процессор, продемонстрированный на рис. 6. В этой структуре присутствует множество выполняющих узлов: один для целочисленных арифметических операций, второй — для операций с плавающей точкой и еще один — для логических операции. За один такт считывается две или более коман­ды, которые декодируются и сбрасываются в буфер хранения, где они ждут своей очереди на выполнение. Когда выполняющее устройство освобождается, оно за­глядывает в буфер хранения, интересуясь, есть ли там команда, которую оно может обработать, и если да, то забирает ее и выполняет. В результате команды часто ис­полняются не в порядке их следования.
Структура оперативной памяти. Форматы данных и команд.

Структура оперативной памяти

ОП состоит из ячеек, в каждой из которых может находиться единица информации – машинное слово. Каждая ячейка имеет две характеристики: адрес и содержимое. Через регистр адреса микропроцессора можно обратиться к любой ячейке памяти. Количество ячеек памяти зависит от разрядности регистра адреса:

К=2n,

Где К – количество ячеек памяти, n – разрядность регистра адреса.

Например, имея 8-ми разрядный регистр адреса можно адресовать 256 ячеек памяти. Если принять, что машинное слово – 1 байт, то следовательно максимальная оперативная память не может превышать 256 байт.

Посчитайте, с ОП какого максимального размера может работать МП, если регистр адреса 16-разрядный и машинное слово – 1 байт.

Ответ  - 64 Кбайта

А если регистр адреса – 32 разрядный и машинное слово –  байт?

Ответ – 4 Гб.

Иначе говоря, 32 разрядный МП может адресовать 1 Гб ОП.

Формат команд и методы адресации

Команды 32-разрядных процессоров содержат одно- или двухбайтный код инструкции, за ко­торым могут следовать несколько байт, определяющих режим исполнения коман­ды, и операнды. Команды могут использовать до трех операндов (или ни одного). Операнды – данные для выполнения команды. Например, команда сложения должна содержать 2 операнда – 2 числа, которые нужно просуммировать.

 Операнды могут находиться в памяти, регистрах процессора или непосредственно в команде.

Если операнд находится в команде (задан константой), то такая адресация данных называется непосредственной.

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

Примеры:

1.    Add R1,28

На то, какой именно метод адресации используется, указывают старшие два двоичных разряда операнда. 

Память

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

Рис. Типичная иерархическая структура памяти. Числа приблизительны

Верхний слой состоит из внутренних регистров центрального процессора. Они сделаны из того же материала, что и процессор, и так же быстры, как и сам процес­сор. Поэтому при доступе к ним обычно не возникает задержек. Внутренние регист­ры предоставляют возможность для хранения 32 х 32 бит на 32-разрядном процес­соре и 64 х 64 бит на 64-разрядном процессоре. Это составляет меньше одного килобайта в обоих случаях. Программы сами могут управлять регистрами (то есть решать, что в них хранить) без вмешательства аппаратуры.

В следующем слое находится кэш-память, в основном контролируемая обо­рудованием. Оперативная память разделена на кэш-строки, обычно по 64 байт, с адресацией от 0 до 63 в нулевой строке, от 64 до 127 в первой строке и т. д. Наи­более часто используемые строки кэша хранятся в высокоскоростной кэш-памя­ти, расположенной внутри центрального процессора или очень близко к нему. Ког­да программа должна прочитать слово из памяти, кэш-микросхема проверяет, есть ли нужная строка в кэше. Если это так, то происходит результативное обращение к кэш-памяти, запрос удовлетворяется целиком из кэша и запрос к памяти на шину не выставляется. Удачное обращение к кэшу, как правило, по времени занимает около двух тактов, а неудачное приводит к обращению к памяти с существенной потерей времени. Кэш-память ограничена в размере, что обусловлено ее высокой стоимостью. В некоторых машинах есть два или даже три уровня кэша, причем каждый последующий медленнее и больше предыдущего.

Далее следует оперативная память. Это главная рабочая область запоминаю­щего устройства машины. Оперативную память часто называют ОЗУ (оператив­ное запоминающее устройство, в англоязычной литературе RAM, Random Access Memory — память с произвольным доступом). Раньше иногда ее называли core memory — запоминающее устройство на магнитных сердечниках, поскольку в 50-е и 60-е годы в компьютерах для оперативной памяти использовали крошечные намагничиваемые ферритовые сердечники. Сейчас память составляет десятки и сотни мегабайт и растет с потрясающей скоростью. Все запросы центрального процессора, которые не могут быть выполнены кэш-памятью, поступают для об­работки в основную память.

Следующим в продемонстрированной на рисунке структуре идет магнитный диск (жесткий диск). Дисковая память на два порядка дешевле ОЗУ в пересчете на бит и зачастую на два порядка больше по величине. У диска есть только одна проблема: случайный доступ к данным на нем занимает примерно на три порядка больше времени. Причиной низкой скорости жесткого диска является тот факт, что диск представляет собой механическую конструкцию, устройство которой про­демонстрировано на рис.

Рис. Устройство жесткого диска

Жесткий диск состоит из одной или нескольких металлических пластин, вра­щающихся со скоростью 5400, 7200 или 10 800 оборотов в минуту. Механическая вилка поворачивается над дисками подобно звукоснимателю на старых граммо­фонах для проигрывания виниловых пластинок на скорости 33 оборота в минуту. Информация записывается на пластины в виде концентрических окружностей. Головки в каждой заданной позиции вилки могут прочитать кольцо на пластине, называемое дорожкой. Все вместе дорожки для заданной позиции вилки форми­руют цилиндр.

Каждая дорожка разделена на некоторое количество секторов, обычно по 512 байт на сектор. На современных дисках внешние цилиндры содержат большее количество секторов, чем внутренние. Перемещение головки от одного цилиндра к другому занимает около 1 мс, а перемещение к произвольному цилиндру требует от 5 до 10 мс, в зависимости от диска. Когда головка располагается над правильной дорожкой, нужно ждать, пока двигатель повернет диск так, чтобы под головкой встал требуемый сектор. Это занимает дополнительно от 5 до 10 мс, в зависимости от скорости вращения диска. Дальше, когда сектор уже находится под головкой, процесс чтения или записи происходит со скоростью от 5 Мбайт/с для низкоско­ростных дисков до 160 Мбайт/с для самых высокоскоростных.

Последний слой в пирамиде памяти занимает магнитная лента. Этот носитель часто используется для создания резервных копий пространства жесткого диска или для хранения очень больших наборов данных. Для доступа к информации на ленте ее сначала нужно поместить в устройство для чтения магнитных лент — это может делать человек или робот (автоматическое управление лентами обычно ис­пользуется при работе с огромными базами). Затем лента перематывается до запра­шиваемого блока с информацией. Весь процесс может длиться минуты. Большой плюс лент заключается в том, что они крайне дешевы и мобильны. Это очень важно для резервных копий, которые нужно содержать отдельно, чтобы они сохранились после стихийных бедствий, например пожаров, наводнений, землетрясений и т. д.

Кроме описанных выше видов во многих компьютерах есть небольшое количе­ство постоянной памяти с произвольным доступом — в отличие от оперативной памяти, она не теряет свое содержимое при выключении энергии машины. ПЗУ (постоянное запоминающее устройство, ROM, Read Only Memory — память толь­ко для чтения) программируется в процессе производства и после этого его содер­жимое нельзя изменить. Такая память достаточно быстра и дешева. На некоторых компьютерах программы начальной загрузки, используемые при запуске компью­тера, находятся в ПЗУ. Кроме того, некоторые карты ввода-вывода содержат ПЗУ для управления низкоуровневыми устройствами.

Электрически стираемое ПЗУ (EEPROM, Electrically Erasable ROM) и флэш-ОЗУ (flash RAM) также энергонезависимы, но в отличие от ПЗУ их содержимое можно стереть и переписать. Однако запись данных на них требует намного боль­ше времени, чем запись в оперативную память. Поэтому они используются точно так же, как и ПЗУ. Дополнительное преимущество электрически стираемого ПЗУ и флэш-ОЗУ состоит в том, что с их помощью теперь можно исправить ошибки, содержащиеся в программах.

Существует еще один вид памяти, называемый CMOS и являющийся энерго­зависимым. Во многих компьютерах CMOS-память используется для хранения текущих даты и времени. CMOS-память и часовая микросхема, отвечающая за от­счет времени, получают питание от маленького аккумулятора, поэтому компью­тер всегда показывает правильное время, даже если он был выключен. CMOS так­же может содержать конфигурационные параметры, например указание, с какого жесткого диска производить загрузку. CMOS-память используется для этих целей, так как она потребляет настолько мало энергии, что установленный на фабрике аккумулятор часто работает в течение нескольких лет.

Рассмотрим основную часть оперативной памяти. Зачастую крайне желательно держать сложные программы в памяти целиком. Если, например, одна программа находится в заблокированном состоянии, ожи­дая окончания операции чтения данных с диска, то другая программа может в это время использовать центральный процессор, что улучшает показатели эксплуата­ции процессора. Но при одновременном нахождении в памяти нескольких про­грамм возникает необходимость решения двух следующих проблем:

1.   Как защитить программы друг от друга, а ядро системы от всех них?

2.   Как управлять перемещением программ в памяти?

Возможны различные решения этих вопросов. Но все они предполагают снаб­жение процессора специальным оборудованием.

Простейшее решение показано на рис. а.

Рис. а используется одна пара база—предел. Программа имеет доступ к части памяти,

находящейся между базой и пределом (а); используются две пары база—предел. Код программы находится между базой 1 и пределом 1, а данные к ней — между базой 2 и пределом 2 (б)

На рисунке видно, что компьютер оборудован двумя специальными регистрами: базовым и предельным. Когда программа начинает работать, в базовый регистр загружа­ется адрес начала исполняемого модуля программы, а предельный регистр говорит о том, сколько занимает исполняемый модуль программы вместе с данными. При выборке команды из памяти аппаратура проверяет счетчик команд, и если он меньше, чем предельный регистр, то добавляет к нему значение базового регистра, а сумму передает памяти. Когда программа хочет прочитать слово данных (например, из адреса 10 000), аппаратура автоматически добавляет к этому адресу содержимое базового регистра (например, 50 000) и передает сумму (60 000) памяти. Базовый регистр дает возможность программе ссылаться на любую часть памяти, следующую за хранящимся в нем адресом. Кроме того, предельный регистр запрещает програм­ме обращение к любой части памяти после программы. Таким образом, с помощью этой схемы решаются обе задачи: защиты и перемещения программ. Стоимость решения равна двум новым регистрам и незначительному увеличению времени, затрачиваемого на операцию (уходящего на проверку предела и суммирование).

В результате проверки и преобразования данных адрес, сформированный програм­мой и называемый виртуальным, переводится в адрес, используемый памятью и на­зываемый физическим. Устройство, которое выполняет проверку и преобразование, называется устройством управления памятью или диспетчером памяти (MMU, Memory Management Unit). Диспетчер памяти располагается или в схеме процес­сора, или близко к ней, но логически находится между процессором и памятью.

Более сложный диспетчер памяти показан на рис. 6. Здесь диспетчер памя­ти состоит из двух пар базового и предельных регистров: одна пара для текста программы, другая — для данных. Командный регистр и все другие ссылки на текст программы работают с парой 1, а ссылки на данные используют пару 2. Появля­ется возможность делить одну и ту же программу между несколькими пользо­вателями и при этом хранить в памяти только одну копию программы, что было невозможно в первой схеме. Когда работает программа 1, четыре регистра распо­ложены так, как показано стрелками на рис. б слева. При работе программы 2 они располагаются так, как показано стрелками на рисунке справа. На самом деле существуют намного более сложные диспетчеры памяти, мы изучим их позже в этой книге. А сейчас нужно запомнить, что управление диспетчером памяти должно быть функцией операционной системы, так как нет уверенности, что пользователь сделает это корректно.

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

Во-вторых, при переключении от одной программы к другой регистры управле­ния памятью должны меняться. На рис.  б требуется перезагрузка только четы­рех регистров, что не является серьезной проблемой, но в реальных диспетчерах памяти должно перезагружаться, явно или динамически, намного большее коли­чество регистров. В любом случае подобная операция занимает некоторое время. Мораль этой истории такова: переключение от одной программы к другой, назы­ваемое переключением контекста, очень дорого.