ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2021
Просмотров: 145
Скачиваний: 1
Лекция 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 нового набора. Восемь глобальных регистров не меняются.
В отличие от памяти, которая виртуально бесконечна (по крайней мере, в отношении стеков), при многократном вложении вызовов процедур машина может исчерпать регистровые окна. В этом случае самый старый набор регистров сохраняется в памяти для освобождения нового набора. Соответственно после многократных выходов из процедур может понадобиться восстановление набора регистров из памяти. Отсюда следует, что система регистровых окон выгодна лишь при отсутствии глубоких вложений процедур.