Лекции по Вычислительным машинам, системам и сетям   

4. Микропроцессор Itanium

4.1. Программная модель пользователя

64-разрядный микропроцессор фирмы Intel ITANIUM (Itanium II) представляет RISC-процессор, имеющий большое число внутренних регистров, фиксированный формат машинной команды и ряд других особенностей, характеризующих процессоры данного вида. Фиксирован-ный формат машинной команды позволяет эффективно организовать конвейер команд за счет однотипности действий процессора. Большое число регистров и особенности их использования позволяют свести до минимума количество обращений к оперативной памяти. Это приводит к увеличению быстродействия процессора.

Архитектурно Itanium не похож на 32-разрядные про-цессоры предыдущих поколений (имеются в виду процес-соры фирмы Intel). Itanium поддерживает программную модель и систему команд 32-разрядных процессоров (IA-32 архитектура). В любой момент процессор может выполнять либо базовый поток команд Itanium, либо поток команд IA-32. Для переключения с одного потока команд на другой есть специальные команды. Команда jmpe (команда IA-32) переключает процессор на базовый поток команд, а команда br.ia (базового потока – «branch IA») – на поток IA-32. При выполнении потока IA-32 процессор ассоциирует часть своих внутренних регистров с регист-рами процессора класса Pentium III (смотри разд. 4.5), переходя на программную модель 32-разрядного процессора. Операционную систему (ОС), предназначен-ную для Itanium, можно написать в одном из трех вариантов:

- поддерживает только поток команд IA-32;

- поддерживает только базовый поток команд;

- поддерживает микширование потоков.

На Itanium можно использовать ОС: Windows 95, 98, 2000,...XP… Команды базового потока совсем не похожи на хорошо известный Ассемблер 16- и 32-разрядных процессоров. Например, привычный для нас фрагмент кода на обычном Ассемблере

        cmp eax, ebx

        jne m1

        add ebx, 7

        jmp m2

m1: add ebx,10

m2:  ………

; сравнить содержимое регистров

; если не равно – прыжок на m1

; если равно – прибавить к ebx 7

; прыжок на m2

; если не равно – прибавить к ebx 10

в системе команд Itanium может выглядеть примерно так:

cmp.ne р1,р2  =  r1,r2

(р2) add r4  =  r2, 7

(p1) add r4  =  r2, 10

// сравнить содержимое регистров r1 //   // иr2, по результатам сравнения
// установить значения предикатов р1 // и р2 (р2 = 1, если r1 = r2, а p1 – в
// противном случае)

// выполняется, если р2 = 1, результат в // r4

// выполняется, если р1 = 1, результат в // r4

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

Регистры пользователя доступны на любом уровне привилегий, хотя для некоторых из них на любом уровне привилегий доступны только определенные поля, а не весь регистр в целом. Системные регистры доступны только на 0-м уровне привилегий.

Набор внутренних регистров Itanium очень велик, поэтому не представляется возможным отобразить их на одном рисунке. Ограничимся их перечислением и кратким описанием. Рассмотрим регистры, составляющие програм-мную модель пользователя  (Application Register Model).

Регистры общего назначения (General Registers). Таких регистров 128. На модели они обозначаются GR0 GR127, а в ассемблерных командах r0 – r127. Формат этих регистров – 64 значащих бита, кроме того, с каждым таким регистром ассоциирован еще один добавочный бит, называемый NaT (Not a Thing – «не вещь»). Этот бит используется для отслеживания отсроченных спекулятивных особых случаев.

Регистры общего назначения разбиты на два подмножества. Регистры GR0 – GR31 называются стати-ческими, и они доступны любым программам и подпрограммам. В регистре GR0 навсегда «зашит» 0. Это удобно, поскольку довольно часто приходится оперировать с нулем. Статические регистры GR16 – GR31 составляют, так называемый Регистровый банк (Banked Registers). В процессоре два набора регистров GR16 – GR31. Один из этих наборов называется Банк0, другой ‑ Банк1. В любой момент доступны регистры только одного банка, регистры другого банка в это время сохраняют свое состояние. Переключение с одного банка на другой происходит при прерывании, при возврате из прерывания по команде rfi (return from interruption) или по команде bsw (bank switch).

Регистры GR32 – GR127 составляют Регистровый стек (Stacked Registers). Смысл его в максимальном уменьшении количества обращений к памяти при вызове подпрограмм и возврате из них. Программа (или подпрограмма) с помощью команды alloc выделяет в Регистровом стеке «окно» (frame), в которое входят локальные и выходные регистры. Не важно, в какой области Стека будет физически выделено это окно. Для текущей программы окно всегда начинается с GR32. Допустим, программа (подпрограмма) затребовала 8 регистров и ей выделили физически регистры GR40 – GR47. Процессор при этом автоматически установит указатель начала Стека на GR40 и этот регистр получит временное имя GR32. Остальные регистры Стека также получат временные имена:

GR41 à GR33 ……GR39 à GR127.

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

Предикаты (Predicate Registers).

Набор из 64 однобитных регистров PR0 – PR63 используется для фиксации результата в командах сравнения. Все эти регистры доступны любым программам на любом  уровне привилегий. Предикаты разбиты на два подмножества: статические предикаты (PR0 – PR15) и «вращаемые» предикаты (PR16 – PR63) (Rotation Predicate Registers). В PR0 навсегда «зашита» единица, что соответствует значению «истина». Вращаемые предикаты можно программным образом (с помощью команды alloc) переименовывать, назначая им временные номера. Используется вращение предикатов (и не только предикатов, но и других регистров) при ускоренном выполнении циклов, когда на исполнение, благодаря конвейеру, запускаются сразу несколько итераций цикла (modulo scheduling loops). Возникает необходимость для каждой итерации использовать наборы регистров, являю-щихся физически различными, но имеющими одинаковые временные имена, в том числе и регистры условий.

Регистры с плавающей точкой (Floating Point Registers).

Набор из 128 (82-разрядных) регистров FR0 – FR127. Регистры доступны на любом уровне привилегий. Набор разбит на два подмножества: статические регистры (FR0 – FR31) и вращаемые регистры (FR31 – FR127). В FR0 навсегда зашито 0.0, а в FR11.0. Назначение вращаемых регистров аналогично назначению вращаемых предикатов.

Регистры переходов (Branch Registers).

Восемь 64-разрядных регистров, в которые можно записать целевые адреса для косвенных переходов. Доступны на любом уровне привилегий.

Указатель команды (Instruction Pointer).

64-битный регистр (IP), сохраняющий адрес командной группы (bundle), в которой содержится выполняемая в данный момент команда. Процессор всегда считывает из памяти командную группу, содержащую три команды (по 41 биту на команду) и 5-битовое поле ‑ шаблон. Последнее задает дополнительные сведения о выполнении входящих в данную группу команд. Поскольку группа всегда 16-байтовая и всегда выровнена по соответствующей границе, младшие 4 бита IP всегда равны нулю. Содер-жимое IP можно прочитать с помощью команды mov ip.

Маркер текущего окна (Current Frame Marker).

38-битовый регистр CFM. Задает текущее окно в Регистровом стеке. Содержит размер окна, размер облас-ти локальных регистров и указатели на регистр общего назначения, регистр с плавающей точкой и предикат, переименованные, соответственно, в GR32, FR32 и PR16. При выполнении команды br.call (вызов подпрограммы) содержимое CFM автоматически копируется в поле Маркер предыдущего окна (Previous Frame Marker) в регистре Предыдущее функциональное состояние (Previous Function State Register), а в CFM записывается новая информация, описывающая новое окно без локальных и вращаемых регистров, но с выходными регистрами родительской программы.

Первый выходной регистр родительской программы при этом переименовывается в GR32. При возврате из подпрограммы по команде br.ret родительское окно автоматически восстанавливается, поскольку информация из PFM переписывается в CFM. Прямая запись в CFM или прямое чтение CFM невозможны.

Маска пользователя (User Mask).

6-битовое поле в Processor Status Register (см. разд. 4.5), доступное приложениям. Содержит пять флагов, определяющих способы контроля выравнивания, мониторинга производительности и др.

Регистры данных мониторинга производительности (Performance Monitor Data Registers).

Эти регистры представляют собой счетчики аппаратных и программных событий, происходящих в системе. Любая модель Itanium содержит минимум 4 пары счетчиков производительности PCM/PMD. PCM (Performance monitor configuration registers) относятся к программной модели системного программиста и доступны только ОС. В PCM задается, какие события будет подсчитывать соответствующий PMD. Сами счетчики (PMD) могут быть доступны пользователю, если имеется соответствующее разрешение ОС.

Регистры идентификации процессора (Processor identifiers).

Обозначаются CPUID0 – CPUIDN, т.е. для различных моделей число этих регистров различно. CPUID0 – CPUID4 существуют обязательно. Сколько всего регистров CPUID содержит данный процессор, задается в соответствующем поле (биты 7 – 0) CPUID3. В CPUID0 – CPUID1 в ASCII-коде задаются сведения о производителе. CPUID2 зарезервирован. В CPUID3 задаются номера семейства и модели. В CPUID4 задаются особенности, которые поддерживает данный процессор.

Регистры приложений (Application registers).

Регистровый файл AR0 – AR127 содержит самые разнообразные регистры специального назначения. В частности, в состав файла входят Регистры ядра (KR0 – KR7), через которые ОС может поставлять приложению разнообразную информацию, Интервальный таймер (ITC) и другие. Часть регистров в файле зарезервированы, а часть используется для IA-32-архитектуры.



*****
© Банк лекций Siblec.ru
Формальные, технические, естественные, общественные, гуманитарные, и другие науки.