Реклама:

Архитектура SPARC была впервые введена в 1987 году компанией Sun Microsystems. Эта архитектура стала одной из первых RISC-архитектур промышленного назначения. Она была основана на исследовании, проведенном в Беркли в 80-е годы [161, 164]. Изначально архитектура SPARC была 32-разрядной, но UltraSPARC III - это 64-разрядная машина, основанная на архитектуре Version 9 SPARC, и именно ее мы будем описывать в этой главе. В целях согласованности с остальными частями книги мы будем называть данную систему UltraSPARC III, хотя на уровне архитектуры набора команд все машины UltraSPARC идентичны.

Структура памяти машины UltraSPARC III очень проста - линейный массив размером 264 байт. В настоящее время реализовать ее невозможно, поскольку память слишком велика (18 446 744 073 709 551 616 байт). Современные реализации имеют ограничение на размер адресного пространства, к которому они могут обращаться (244 байт у UltraSPARC III), но в будущем это число увеличится. Байты нумеруются слева направо, но можно перейти на нумерацию справа налево, установив один из битов во флаговом регистре.

Важно, что предельное число адресуемых байтов больше, чем требуется для реализации архитектуры команд, поскольку в будущем скорее всего понадобится увеличить объем памяти, к которой может обращаться процессор. Одна из самых серьезных проблем состоит в том, что архитектура команд ограничивает размер адресуемой памяти. Это - проявление глобальной информационной проблемы (имеющихся битов всегда не хватает), которая, вероятно, не разрешится никогда. Когда-нибудь наши внуки будут удивляться, как же могли работать компьютеры, содержащие всего 32-разрядные адреса и 4 Гбайт памяти.

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

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

Таблица 5.1. Регистры общего назначения в системе UltraSPARC III

Регистр Другой вариант названия Назначение

R0

GO

 

Аппаратный нуль. То, что сохранено в этом регистре, просто игнорируется

R1-R7

G1-

-G7

Содержат глобальные переменные

R8-R13

О0-

-05

Содержат параметры вызываемой процедуры

R14

SP

 

Указатель стека

R15

 

Временный регистр

R16-R23

L0-

-L7

Содержат локальные переменные для текущей процедуры

R24-R29

Ю-

Содержат входные параметры

R30

FP

 

Указатель на базу текущего стекового фрейма

R31

 

Содержит адрес возврата для текущей процедуры

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

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

Специальные регистры используются для особых целей. Регистры РР и БР ограничивают текущий фрейм. Первый указывает на базу текущего фрейма и применяется для обращения к локальным переменным, точно так же, как ЬУ на рис. 4.9. Второй указывает на текущую вершину стека и изменяется, когда слова помещаются в стек или выталкиваются оттуда. Значение регистра РР изменяется только при вызове и завершении процедуры. Третий специальный регистр - Я31. Он содержит адрес возврата для текущей процедуры.

Общий обзор уровня архитектуры набора команд UltraSPARC III

Рис. 5.4. Регистровые окна системы UltraSPARC III

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

Команда вызова процедуры скрывает старый набор регистров и путем изменения CWP предоставляет новый набор, который может использовать вызванная процедура. Однако некоторые регистры переходят от вызывающей процедуры к вызванной, что обеспечивает эффективную передачу параметров между процедурами. Для этого часть регистров переименовываются: после вызова процедуры прежние выходные регистры с R8 по R15 остаются доступными, но превращаются во входные регистры с R24 по R31. Восемь глобальных регистров не меняются. Это всегда один и тот же набор регистров.

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

В системе UltraSPARC III есть также 32 регистра для обработки команд с плавающей точкой, которые могут содержать либо 32-разрядные (одинарная точность), либо 64-разрядные (двойная точность) значения. Можно также использовать пары этих регистров, чтобы поддерживать 128-разрядные значения.

Архитектура UltraSPARC II - архитектура загрузки и сохранения. Это означает, что единственные команды, которые непосредственно обращаются к памяти, - это LOAD (загрузка) и STORE (сохранение), обеспечивающие перемещение данных между регистрами и памятью. Все операнды для команд арифметических и логических операций должны извлекаться из регистров или предоставляться самой командой (без обращений к памяти), а все результаты должны сохраняться в регистрах (но не в памяти).

Общий обзор уровня архитектуры набора команд Pentium 4 || Оглавление || Обзор уровня архитектуры набора команд микросхемы 8051