ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2021

Просмотров: 145

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

6


Лекция 10


5. Уровень системы команд


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

Большое значение имеют также принципы построения системы команд в рамках данной технологии. Это сказывается как на вычислительных возможностях, так и стоимости компьютеров. Производительность эквивалентных машин с различными уровнями команд может различаться на 25%. Поэтому важно понимать принципы разработки этого уровня.

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


5.1. Общий обзор уровня команд


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


5.1.1. Модели памяти


Во всех компьютерах память разделена на ячейки, имеющие последовательные номера (адреса). В настоящее время наиболее распространенной ячейкой является байт - 8 двоичных разрядов (битов). Изначально это можно объяснить тем, что 8 - это минимальная степень двойки, подходящая для хранения общеупотребительных наборов символов (например, ASCII). Вполне возможно, что в связи с доминированием UNICODE в будущем минимальная ячейка станет 16-разрядной.

Байты обычно группируются в 2, 4 или 8 - байтные слова, которыми манипулируют команды. Многие архитектуры требуют, чтобы слова были выровнены на их целочисленную границу. Например, 4-байтовое слово должно начинаться с адреса, кратного 4. Такая память более эффективна как с точки зрения быстродействия, так и сложности и стоимости микросхем.

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


Еще один аспект модели памяти - ее семантика. При разработке моделей памяти возникает ряд проблем, связанных с современной компьютерной архитектурой. Во-первых, это вызвано переупорядочиванием микрокоманд. В результате есть опасность того, что память будет действовать не так, как ожидается. Например, команда LOAD может возвратить из ячейки не то значение, которое сохранит предшествующая ей STORE. Во-вторых, при наличии мультипроцессора каждый процессор посылает разделяемой памяти поток запросов чтения/записи, которые также могут подвергаться переупорядочиванию.

Возможны два кардинальных решения подобных проблем. Все запросы к памяти могут быть синхронизированы в последовательности так, чтобы каждый завершался до того как начнется следующий. Такая стратегия очень вредит производительности, но дает простейшую семантику памяти - все операции выполняются в строгом программном порядке. Вторая крайность - вообще не давать никаких гарантий последовательности выполнения запросов к памяти. Чтобы упорядочивать обращения к памяти, программа сама должна выполнять команду SYNC, блокирующую запуск новых операций памяти, пока предыдущие не будут завершены. Эта идея существенно затрудняет разработку компиляторов, зато дает свободу разработчикам аппаратуры в плане оптимизации памяти.

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


5.1.2. Регистры


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

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


В некоторых машинах РОН полностью взаимозаменяемы, в других - частично специализированы. Так в Pentium II регистр EDX может использоваться как РОН, но всегда получает половину произведения и половину делимого. Даже если РОН взаимозаменяемы, операционная система и компиляторы часто принимают соглашения относительно их использования. В частности, некоторые регистры всегда содержат параметры процедур, некоторые используются как временные. Это позволяет совмещать программы, написанные на разных языках (например, делать ассемблерные вставки в программы на языках высокого уровня).

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

Существует один специальный управляющий регистр, представляющий собой привилегированно-пользовательский гибрид. Это регистр флагов, или PSW (Program Status Word - слово состояния программы). Его содержимое рассматривается как совокупность битов-признаков, к которым, в частности, относятся коды условия. Эти биты устанавливаются в каждом цикле АЛУ и отражают состояние результата предыдущей операции. Они включают:

  • N - признак отрицательного результата (Negative);

  • Z - признак нулевого результата (Zero);

  • V - переполнение (oVerFlow);

  • C - перенос бита из старшего разряда (Carry out).

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


5.1.3. Команды


Системы команд существенно различаются в конкретных архитектурах. Однако практически всегда присутствуют команды LOAD и STORE (или их аналоги) для перемещения данных между регистрами и памятью, а также команда MOVE для копирования данных из одного регистра в другой. Всегда имеются наборы арифметических, логических команд, команд сравнения и условных переходов. Рассмотрим наиболее важные особенности конкретных систем команд.


5.1.3.1. Особенности уровня команд Pentium II


Архитектура Pentium II обеспечивает обратную совместимость вплоть до 16-битных процессоров Intel 8086/8088. Их последователь 80286 также был 16-разрядным, но имел 20-разрядную адресную шину и соответственно большее адресное пространство - . Оно не было линейным. Адрес состоял из 16-разрядного номера сегмента и 16-разрядного смещения. Для нахождения абсолютного адреса номер сегмента сдвигается влево на 4 разряда и складывается со смещением.


Процессор 80386 - первая 32-разрядная машина фирмы Intel. Последующие процессоры (80486, Pentium, Pentium Pro, Pentium II, Celeron, Xeon) имеют такую же архитектуру, называемую IA-32.

Pentium II имеет три режима работы, в двух из которых он работает как 8086. В реальном режиме отключаются все особенности, добавленные к процессору со времен 8086/8088. Если программа совершает ошибку, то происходит полный отказ системы. На следующей ступени находится виртуальный режим 8086, в котором программы для 8086/8088 выполняются с защитой. Для запуска программы операционная система создает изолированную среду, в результате при программном сбое управление передается операционной системе.

Наконец, защищенный режим предоставляет программам все возможности системы команд. В этом режиме доступны 4 уровня привилегий, которые управляются битами в регистре флагов. Уровень 0 соответствует привилегированному режиму на других компьютерах и имеет полный доступ к машине. Он используется лишь операционной системой. Уровень 3 предназначен для пользовательских программ. Уровни 1,2 используются редко. Pentium II имеет огромное адресное пространство. Память разделена на 16384 сегмента, каждый из которых содержит адреса от 0 до . Однако большинство операционных систем (включая UNIX и все Windows) поддерживают только один сегмент, поэтому большинство прикладных программ видят линейное пространство в байтов, часть которого занимает сама ОС. Слова состоят из 4-х байтов (не путать с типом WORD), байты в слове нумеруются справа налево.

Pentium II имеет ряд регистров. В компьютерах 8088 и 80286 были только 8- и 16-битные регистры, в 80386 появились 32-разрядные. Для поддержки совместимости каждый пользовательский 32-битный регистр содержит в своей младшей части свою 16-битную версию. Имя 32-битного регистра получается добавлением префикса E (Extended) к имени соответствующего 16-битного.

К ним в первую очередь относятся четыре 32-битных регистра EAX, EBX, ECX, EDX. Они являются РОН, но каждый имеет особенности: EAX - основной арифметический регистр; EBX предназначен для хранения указателей (адресов памяти); ECX связан с организацией циклов; EDX используется при умножении и делении - он совместно с EAX содержит 64-битные произведения и делимые. Каждый из них в младшей части содержит 16-разрядный регистр, который в свою очередь содержит два 8-разрядных регистра:


EAX = ( , AX); AX = (AH, AL);

EBX = ( , BX); BX = (BH, BL);

ECX = ( , CX); CX = (CH, CL);

EDX = ( , DX); DX = (DH, DL).


Следующие три регистра также являются РОН, но имеют еще большую специализацию. Регистры ESI и EDI хранят указатели, особенно для команд манипулирования символьными цепочками. ESI указывает на входную цепочку, EDI - на выходную. Регистр EBP также содержит указатели. Обычно он используется для ссылки на текущий фрейм локальных переменных в стеке.

Регистр ESP - указатель стека.

Следующая группа регистров – CS (сегмент кода), SS (сегмент стека), DS (сегмент данных), ES, FS, GS (дополнительные сегменты данных). Это 16-разрядные сегментные регистры. Они унаследованы от предыдущих процессоров и содержат адреса сегментов. При использовании линейного 32-битного адресного пространства их можно игнорировать.


Регистр EIP - это счетчик команд (Extended Instruction Pointer). Регистр EFLAGS - регистр флагов.


5.1.3.2. Особенности уровня команд UltraSPARC II


Изначально система SPARC имела 32-разрядную архитектуру, но UltraSPARC - 64-разрядные машины. Структура памяти UltraSPARC II представляет собой линейный массив байтов. Это настолько большое число, что в настоящее время реализовать такой объем памяти невозможно. Современные реализации имеют ограничения на объем памяти, к которой они могут обращаться ( байтов у UltraSPARC II). Байты в слове нумеруются слева направо, но этот порядок можно изменить на противоположный, установив соответствующий бит в регистре флагов.

В системе UltraSPARC II имеется две группы 64-битных регистров по 32 в каждой: регистры общего назначения и регистры с плавающей точкой. Регистры общего назначения называются R0-R31, но в некоторых контекстах имеют другие названия. Все они, кроме R0, могут считываться и записываться с помощью различных команд. Их использование частично оговаривается соглашениями, частично основано на их обработке аппаратурой. Отклоняться от этих функций без необходимости не рекомендуется:

R0 (другое название - G0) всегда содержит значение 0;

R1-R7 (G1-G7) содержат глобальные переменные;

R8-R13 (O0-O5) содержат выходные параметры вызываемой процедуры;

R14 (SP) - указатель стека;

R15 (O7) - временный регистр;

R16-R23 (L0-L7) содержат локальные переменные текущей процедуры;

R24-R29 (I0-I5) содержат входные параметры процедуры;

R30 (FP) - указатель текущего стекового фрейма;

R31 (I7) содержит адрес возврата из текущей процедуры.


В действительности процессор UltraSPARC II имеет более чем 32 РОН, но в каждый момент времени программе видны только 32 из них. Эта система регистровых окон предназначена для повышения эффективности вызова процедур. Основная ее идея - имитировать работу стека с помощью регистров. Существует несколько наборов регистров подобно нескольким фреймам в стеке. Специальный регистр CWP (Current Window Pointer) указывает на текущий набор РОН. Команда вызова процедуры скрывает старый набор регистров и путем изменения CWP предоставляет новый набор, который может использовать вызываемая процедура. Некоторые регистры переносятся из старого набора, меняя свои имена. Например, регистры R8-R15 старого набора становятся регистрами R24-R31 нового набора. Восемь глобальных регистров не меняются.

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