9. Интерфейсные программные соглашения

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

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

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

  • К видимым сегментам задача имеет возможность обращения.

  • Служебные сегменты необходимы для функционирования задачи.

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

9.1.1. Сегменты программы

В нижеприведенной таблице приведен список сегментов программы с кратким описанием характеристик каждого сегмента.

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

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

Сегменты программы

Название сегмента

Разделение

Количество

Возможная адресация

Содержимое

TEXT

Да

1 на модуль

Относительно CUD абсолютная

Исполняемый код процедур

DATA

Нет

1 на модуль

Относительно GD абсолютная

Глобальные данные

HEAP

Нет

1 на задачу

Абсолютная

Динамические данные

STACK

Нет

1 на thread

Относительно USD

Локальные данные процедур

CHAIN STACK

Нет

1 на thread

?

Сохранение информации процедурного механизма

REGISTER STACK

Нет

1 на thread

Относительно WD

Локальные и рабочие данные процедуры

THREAD DATA

Нет

1 на thread

?

?

SHARED DATA

Да

Любое

?

?

9.1.2. Организация обращения в память

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

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

Регулярные страницы не имеют особых признаков доступа, таких как привилегированность или адресная защищённость. В регулярную страницу возможен доступ по абсолютному адресу в виде целого числа, а также по дескриптору.

Архитектурно обращение в память поддерживается следующими семействами операций:

  • LD/ST - обращение в память по целому. Этими командами реализуется обращение в память по абсолютному адресу. Обращение возможно только в регулярные страницы. Операции имеют два адресных операнда формата 64 разряда. Адрес доступа в память формируется суммированием операндов.

  • LDGD/STGD – обращение в память относительно регистра GD. Операции имеют два адресных операнда формата 32 разряда. Адрес доступа в память формируется суммированием операндов и адреса начала области памяти из регистра GD. Если полученный адрес выходит за границу области, описываемой регистром GD, при обращении в память возникает прерывание.

Все семейства операций обращения в память поддерживают обращения по следующим форматам:

  • Байт (B) – обращение в память размером 8 разрядов.

  • Половина слова (H) - обращение в память размером 16 разрядов.

  • Слово (W) - обращение в память размером 32 разряда.

  • Двойное слово (D) - обращение в память размером 64 разряда.

  • Квадро слово (Q) - обращение в память размером 128 разрядов.

Примечание. Для операций доступа в память семейств операций LD/ST, LDSS/STSS, LSDS/STDS, LDGS/STGS, LDFS/STFS, LDCS/STCS, LDES/STES, обращение по Q формату не поддерживается.

9.1.3. Семантические модели организации памяти

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

  • Режим 32-х разрядной адресации (далее режим 32). В этой семантической модели регистры GD и CUD описывают всю доступную задаче область памяти. Представителями адресных данных являются 32-х разрядные смещения относительно этих регистров. В рамках 32-х разрядного адресного пространства эти смещения можно считать абсолютными адресами. Размеры указателей равны 4 байтам. Обращение в память реализуется методом доступа по регистру GD через семейство операций LDGD/STGD.

  • Режим 64-х разрядной адресации (далее режим 64). В этой семантической модели всё выделенное задаче пространство памяти должно быть регулярным. Обращение в память реализуется методом доступа по целому семейством операций LD/ST. Представителями адресной информации являются абсолютные адреса. Размеры указателей равны 8 байтам.

9.1.4. Распределение данных

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

9.1.4.1. Глобальные переменные

При распределении в памяти глобальных переменных применяется следующее правило выравнивания. Переменные размера большего, чем 8 байт, должны быть выровнены на 16 байт. Переменные меньшего размера должны быть выровнены на границу следующей большей степени 2. Переменные типа Common Block (FORTRAN) должны быть выровнены на 16 байт независимо от размера. В таблице приведены требования выравнивания для переменных различного размера.

Сегменты программы

Размер в байтах

Требование выравнивания в байтах

1

1

2

2 (четные адреса)

3-4

4

5-8

8

9 и более

16

Глобальные переменные размещаются в сегменте DATA. Доступ к глобальным переменным зависит от семантической модели.

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

Доступ к глобальным переменным для статически собираемого кода осуществляется по смещению относительно регистра GD. Это смещение в сегменте DATA модуля плюс адрес загрузки сегмента DATA. Для статически собираемого кода установку этих значений обеспечивает редактор связей.

Доступ к глобальным переменным для случая позиционно-независимого кода реализуется через дополнительную косвенность посредством считывания адреса ссылки из таблицы GOT модуля. Доступ к элементу таблицы GOT осуществляется по адресу, вычисленному как динамически полученный адрес процедуры использования плюс статически известное смещение до таблицы GOT плюс статически известное смещение нужной ссылки в таблице. Инициализация таблиц GOT модулей производится при загрузке задачи динамическим редактором связей. Обращение к данным реализуется через семейство операций LDGD/STGD.

Доступ к глобальным переменным в режиме 64

Модель обращения к переменным аналогична режиму 32-х разрядной адресации. Все вышеизложенное остаётся верным за исключением того, что используется доступ по целому, и обращение к данным реализуется через семейство операций LD/ST.

9.1.4.2. Локальные статические данные

Размещение статических локальных переменных подчиняется тем же правилам, что и для глобальных переменных.

Доступ к локальным статическим переменным осуществляется как доступ к собственным данным модуля.

9.1.4.3. Константы

Множество констант может быть логически разделено на подмножество символьных констант (строк) и подмножество массивов констант. Каждое подмножество может иметь свое размещение. Распределение возможно либо в сегменте TEXT, либо в сегменте DATA. При размещении действуют правила выравнивания для глобальных переменных.

Доступ к константам такой же, как доступ к собственным данным, за следующим исключением: если константы распределены в сегменте TEXT, то доступ осуществляется операциями LDCUD (режим 32-х разрядной адресации).

9.1.4.4. Динамически выделенные объекты

Динамически выделенные объекты должны иметь выравнивание 16 байт.

Обращение к динамическим объектам в режиме 32-х разрядной адресации осуществляется операциями LDGD/STGD, в режиме 64 — LD/ST.

9.1.4.5. Локальные автоматические переменные

Локальные автоматические переменные выделяются в программном стеке. Механизмы и правила работы с программным стеком будут даны ниже в соответствующем разделе. Здесь отметим, что выделение памяти в стеке удовлетворяет выравниванию на 16 байт. Обращение к объектам в стеке в режиме 32-х разрядной адресации осуществляется операциями LDGD/STGD, в режиме 64-х разрядной адресации — LD/ST.

9.2. Представление данных

Аппаратно поддерживается работа со следующими форматами данных:

  • Байт (UB) – беззнаковое целое размера 8 разрядов.

  • Знаковый байт (SB) - целое со знаком размера 8 разрядов (знаковый разряд и 7 значащих разрядов).

  • Полслова (UH) - беззнаковое целое размера 16 разрядов.

  • Знаковые полслова (SH) - целое со знаком размера 16 разрядов (знаковый разряд и 15 значащих разрядов).

  • Слово (UW) – беззнаковое целое размера 32 разряда.

  • Знаковое слово (SW) – целое со знаком размера 32 разряда (знаковый разряд и 31 значащий разряд).

  • Двойное слово (UD) – беззнаковое целое размера 64 разряда.

  • Знаковое двойное слово (SD) – целое со знаком размера 64 разряда (знаковый разряд и 63 значащих разряда).

  • Квадро слово (NQ) – числовое значение размера 128 разрядов.

  • Вещественное число (FW) – вещественное значение в формате IEEE single precision.

  • Вещественное число удвоенной точности (FD) - вещественное значение в формате IEEE double precision.

  • Расширенное вещественное число (FX) - вещественное значение в формате IEEE double-extended precision.

  • Двойной дескриптор (DD) – адресное значение размера 64 разряда.

  • Квадро дескриптор (DQ) – адресное значение размера 128 разрядов.

Упаковка меньших форматов в большие соответствует little endian. На следующем рисунке для числа 0xF4F3F2F1 проиллюстрировано соответствие нумерации битов и байтов.

Рисунок D-1. Правило упаковки значения.

Правила упаковки значения

Правила упаковки значения

Здесь F1 – младший значащий байт, содержащий младшую часть значения. Цифры сверху показывают порядок байтов, цифры снизу – нумерацию битов.

При работе программы данные располагаются как в памяти, так и на рабочих регистрах. Рабочие регистры имеют следующие форматы:

  • Регистр (SR) – 32-х разрядный регистр.

  • Двойной регистр (DR) – 64-х разрядный регистр.

  • Расширенный регистр (XR) – 80-и разрядный регистр.

  • Квадро регистр (QR) – 128-и разрядный регистр.

Правило соответствия вложенности и нумерации рабочих регистров продемонстрировано на следующем рисунке.

Рисунок D-2. Правило соответствия вложенности рабочих регистров.

Правила соответствия вложенности рабочих регистров

Правила соответствия вложенности рабочих регистров

SR[i]

регистр с номером i, под которым подразумевается четное число (i = 2*n).

SR[i+1]

регистр со следующим, нечетным номером.

XR[i].m

поле расширенного регистра, содержащее 64 младших разряда (мантисса).

XR[i].e

поле расширенного регистра, содержащее 16 старших разрядов (экспонента).

QR[i].lo

младшая часть квадро регистра.

QR[i].hi

старшая часть квадро регистра.

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

Отображение языковых типов данных на архитектурные форматы и соответствующие размеры занимаемых ресурсов зависят от семантической модели.

9.2.1. Отображение целых типов

Отображение целых типов для режима 32-х разрядной адресации приведено в таблице.

Отображение целых типов режима 32-х разрядной адресации

Тип

Формат представления

Отображение в памяти (размер)

Отображение в памяти (выравнивание)

Отображение на регистрах

char

SB

1

1

SR

signed char

SB

1

1

SR

unsigned char

UB

1

1

SR

short

SH

2

2

SR

signed short

SH

2

2

SR

unsigned short

UH

2

2

SR

int

SW

4

4

SR

signed int

SW

4

4

SR

enum

SW

4

4

SR

unsigned int

UW

4

4

SR

long

SW

4

4

SR

unsigned long

UW

4

4

SR

long long

SD

8

8

SR

unsigned long long

UD

8

8

SR

__int128

NQ

16

16

SR

Отображение целых типов для режима 64-х разрядной адресации приведено в таблице.

Отображение целых типов режима 64-х разрядной адресации

Тип

Формат представления

Отображение в памяти (размер)

Отображение в памяти (выравнивание)

Отображение на регистрах

char

SB

1

1

SR

signed char

SB

1

1

SR

unsigned char

UB

1

1

SR

short

SH

2

2

SR

signed short

SH

2

2

SR

unsigned short

UH

2

2

SR

int

SW

4

4

SR

signed int

SW

4

4

SR

enum

SW

4

4

SR

unsigned int

UW

4

4

SR

long

SD

8

8

DR

unsigned long

UD

8

8

DR

long long

SD

8

8

DR

unsigned long long

UD

8

8

DR

__int128

NQ

16

16

QR

9.2.2. Отображение вещественных типов

Вещественные типы представляются в соответствии со стандартом вещественной арифметики ANSI/IEEE 754-1985. Аппаратно поддерживается работа с тремя форматами: простой формат (single), формат удвоенной точности (double) и расширенный формат (extended). Представление форматов вещественных данных приведено на рисунках ниже.

Рисунок D-13. Простой вещественный формат.
Простой вещественный формат.

Простой вещественный формат.

Рисунок D-14. Вещественный формат удвоенной точности.
Вещественный формат удвоенной точности

Вещественный формат удвоенной точности

Рисунок D-15. Расширенный вещественный формат.
Расширенный вещественный формат

Расширенный вещественный формат

Отображение вещественных типов для всех режимов приведено в таблице.

Отображение вещественных типов

Тип

Формат представления

Отображение в памяти (размер)

Отображение в памяти (выравнивание)

Отображение на регистрах

float

FW

4

4

SR

double

FD

8

8

DR

__float80

FX

16

16

XR

__float128

NQ

16

16

QR

long double

FX

16

16

XR

9.2.3. Отображение указательных типов

Отображение указательных типов для режима 32 приведено в таблице.

Отображение указательных типов для режима 32-х разрядной адресации

Тип

Формат представления

Отображение в памяти (размер)

Отображение в памяти (выравнивание)

Отображение на регистрах

any_type*

UW

4

4

SR

any_type(*)()

UW

4

4

SR

Отображение указательных типов для режима 64 приведено в таблице.

Отображение указательных типов для режима 64-х разрядной адресации

Тип

Формат представления

Отображение в памяти (размер)

Отображение в памяти (выравнивание)

Отображение на регистрах

any_type*

UD

8

8

DR

any_type(*)()

UD

8

8

DR

9.2.4. Агрегатные типы

Агрегатные типы включают в себя структуры (struct), объединения (union), классы (class) и массивы. Под структурами и объединениями понимаются типы в нотации языка C: struct и union соответственно. Под классом понимаются типы языка C++: class, struct и union. Они имеют свойства, не имеющие аналогов в типах struct и union языка C.

Выравнивание объектов агрегатных типов должно соответствовать выравниванию их наиболее строго выровненных компонентов. Размер объекта агрегатного типа должен быть кратен выравниванию наиболее строго выровненного компонента. Для структур и объединений это может потребовать расширения размера пустыми полями (паддинг). Значение полей паддинга не определено.

9.2.4.1. Тип массива

Выравнивание объекта типа массив определяется выравниванием элемента этого массива. Размер объекта типа массив равен размеру элемента массива, умноженному на число элементов массива.

9.2.4.2. Тип структуры

Выравнивание и размер объекта типа структуры определяются правилами упаковки членов (полей) этой структуры. Правила упаковки полей для структурных типов:

  • Объект типа структуры должен иметь выравнивание не хуже выравнивания наиболее строго выровненного компонента.

  • Поля упаковываются в структуру по порядку так, что очередное поле получает наименьшее возможное смещение от начала структуры, удовлетворяющее его выравниванию. Это может привести к возникновению внутреннего паддинга, когда требуется пропустить место для размещения очередного компонента, если текущее смещение не соответствует требуемому выравниванию.

  • Размер структуры должен быть увеличен, если суммарный размер всех полей, включая внутренний паддинг, не соответствует кратности выравнивания. Это приводит к возникновению хвостового паддинга.

Нижеприведенные рисунки иллюстрируют действие правил упаковки полей для структур.

Рисунок D-3. Простая маленькая структура
Простая маленькая структура

Простая маленькая структура

Размер структуры – 1 байт. Выравнивание – 1 байт (не требуется).

Рисунок D-4. Плотно упакованная структура без паддинга
Плотно упакованная структура без паддинга

Плотно упакованная структура без паддинга

Размер структуры – 8 байт. Выравнивание определяет поле i – 4 байта.

Рисунок D-5. Структура с внутренним паддингом
Структура с внутренним паддингом

Структура с внутренним паддингом

Размер структуры – 4 байта. Выравнивание определяет поле s - 2 байта. Поле s не может быть размещено сразу после поля c, поскольку это не соответствует его выравниванию. Поэтому в байте 1 возникает поле паддинга.

Рисунок D-6. Структура с внутренним и хвостовым паддингами
Структура с внутренним и хвостовым паддингами

Структура с внутренним и хвостовым паддингами

Размер структуры – 24 байта. Выравнивание определяет поле d - 8 байт. Между полем c и полем d, в байтах с 1 по 7, из-за требования выравнивания поля d появляется внутренний паддинг. После распределения последнего поля s, размер структуры равен 18 байтам, что не кратно выравниванию в 8 байт. Поэтому размер структуры увеличен до 24 байт. В байтах с 18 по 23 находится поле хвостового паддинга.

9.2.4.3. Тип объединение

Выравнивание и размер объекта типа объединение определяются правилами упаковки членов (полей) типа объединение. Правила упаковки полей для типа объединение:

  • Выравнивание объекта типа объединение должно быть не хуже, чем у поля с наиболее строгим выравниванием.

  • Поля упаковываются в объединение так, что начала всех полей совпадают и равны началу объединения.

  • Размер объекта типа объединения должен быть не меньше размера максимального поля и кратен выравниванию. Если размер максимального поля не кратен выравниванию, то размер объединения увеличивается добавлением поля хвостового паддинга.

Нижеприведенные рисунки иллюстрируют правила упаковки полей для объединений.

Рисунок D-7. Объединение
Объединение

Объединение

Размер объединения – 4 байта. Выравнивание – 4 байта.

Рисунок D-8. Объединение
Объединение с хвостовым паддингом

Объединение с хвостовым паддингом

Размер объединения – 4 байта. Выравнивание – 2 байта. Размер максимального поля – 3 байта, что не кратно выравниванию. Поэтому размер объединения увеличен добавлением в 3 байте поля паддинга.

9.2.4.4. Битовые поля

Битовые поля являются членами объекта типа структуры, класса или объединения с заданным в виде числа разрядов размером. Битовые поля определяются базовым типом и числом разрядов. Число разрядов не может быть больше, чем число разрядов в базовом типе. Базовым типом может быть любой целочисленный тип знаковой или беззнаковой модификации. Область памяти, определенная базовым типом, в которой располагается битовое поле, называется контейнером.

Битовые поля подчиняются тем же правилам упаковки, что и не битовые поля с некоторыми добавлениями:

  • Битовые поля располагаются справа налево от менее значащих разрядов к более значащим.

  • Контейнер битового поля должен быть размещен в соответствии с правилами размещения базового типа.

  • В контейнере битового поля могут размещаться другие, в том числе и не битовые поля.

  • Неименованные битовые поля не участвуют в определении общего выравнивания объекта.

  • Неименованные битовые поля ненулевой длины используются для явного задания паддинга.

  • Неименованные битовые поля нулевой длины используются для принудительного выравнивания последующего поля на границу, соответствующую базовому типу этого битового поля.

Следующие рисунки иллюстрируют правила упаковки битовых полей.

Рисунок D-9. Структура с битовыми полями
Структура с битовыми полями

Структура с битовыми полями

Размер структуры – 4 байта. Выравнивание – 4 байта, определяется базовым типом полей, который для всех один. Структура дополняется хвостовым паддингом для того, чтобы размер структуры удовлетворял кратности выравнивания.

Рисунок D-10. Выравнивание в структуре с битовыми полями
Выравнивание в структуре с битовыми полями

Выравнивание в структуре с битовыми полями

Размер структуры – 16 байт. Выравнивание – 8 байт. Выравнивание определяет базовый тип битового поля l. Контейнер для этого поля может быть размещен, начиная с нулевого байта. Но в этот контейнер уже попадает предыдущее поле s. Следующее поле с требует выравнивание на 1 байт. Стало быть, оно может быть размещено только начиная с 24 бита. В битах с 18 по 23 остается поле внутреннего паддинга. По этой же причине возникает внутренний паддинг между полями u и d.

Между полями t и u причина возникновения паддинга следующая. Если контейнер для битового поля u разместить, начиная с 4 байта, а поле начать размещать сразу после поля t, то оно не поместится в отведенный контейнер. Поэтому контейнер для этого поля размещается со следующей границы его выравнивания. После распределения всех полей размер структуры не соответствует кратности выравнивания, что требует добавления хвостового паддинга.

Рисунок D-11. Структура с неименованными битовыми полями нулевой длины
Структура с неименованными битовыми полями нулевой длины

Структура с неименованными битовыми полями нулевой длины

Размер структуры – 9 байт. Выравнивание – 1 байт. Неименованные битовые поля не участвуют в определении выравнивания. Все остальные поля имеют тип, требующий выравнивания на 1 байт. Неименованное битовое поле нулевой длины перед полем d требует выравнивания поля d в соответствии со своим базовым типом int, что приводит к возникновению паддинга с 1 по 3 байт. Неименованное битовое поле длины 9 не может быть размещено сразу после поля d: если разместить контейнер, начиная с 4 бита, поле в него не поместится. Следующее удовлетворяющее выравниванию размещение контейнера для этого битового поля – с 6 байта. Поэтому возникает внутренний паддинг в 5 байте. Само по себе это битовое поле тоже приводит к внутреннему паддингу в 9 бит.

9.3. Описание регистров

Существуют следующие группы программно доступных регистров:

  • рабочие регистры.

  • предикатные регистры.

  • регистры управления.

  • специальные регистры.

Характеристики и назначение каждой группы приведены ниже.

9.3.1. Рабочие регистры

Основное назначение рабочих регистров – расположение данных для вычислительных операций. Из рабочих регистров в операции поступают входные данные. После проведения вычисления результат сохраняется в рабочих регистрах.

Рабочие регистры составляют регистровый файл. Размер регистрового файла - 256 регистров. Нумерация регистров и их форматы приведены выше на рисунке D-2. Регистровый файл разделен на две части: глобальную и стековую. Глобальная область находится в верхней части регистрового файла (младшие номера) и состоит из 32 регистров. Остальные 224 регистра составляют стековую часть регистрового файла. Глобальная часть регистрового файла доступна во всех процедурах и не участвует в процедурных механизмах. Стековая область регистрового файла используется в процедурных механизмах и может быть аппаратно откачана в память или загружена из памяти.

Обращение в регистровый файл к рабочим регистрам реализуется с помощью нескольких механизмов: абсолютной адресацией в регистровый файл и адресацией относительно специального регистра.

9.3.1.1. Механизм регистровых окон

Механизм регистровых окон является важной частью процедурного механизма. Регистровые окна организуются в стековой части регистрового файла. Для этого используется регистр текущего регистрового окна WD. В регистре WD содержится базовый абсолютный адрес начала области (регистровое окно) в регистровом файле и размер этой области.

При процедурном вызове происходит изменение содержимого регистра WD следующим образом. Новое состояние базового адреса может быть установлено вызывающей процедурой в любое место ее регистрового окна. Новый размер устанавливается как разность размера вызывающей процедуры и размера области от начала окна вызывающей процедуры до нового значения базового адреса. Область регистрового файла нового окна доступна и вызванной, и вызывающей процедуре. Эта область используется для передачи параметров и возврата значения (область параметров). Процедурный механизм смены окна проиллюстрирован на рисунке.

Рисунок R-1. Процедурное переключение окна
Процедурное переключение окна

Процедурное переключение окна

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

9.3.1.2. Пространство регистров текущего окна. Программные соглашения использования пространства регистров текущего окна

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

Максимально возможный размер регистрового окна определяется размером стековой области регистрового файла - 224 регистра. Максимальный размер пространства регистров текущего окна определяется кодировкой операций и равен 64 регистрам. Следовательно, в общем случае пространство регистров текущего окна может не накрывать все регистровое окно.

Ассемблерная мнемоника обращения к регистрам текущего окна:

%r[number]   - SR регистр
%dr[number]  - DR регистр
%qr[number]  - QR регистр

где number – номер регистра относительно базового в регистре WD (0 – размер из регистра по модулю 64).

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

Подробно соглашение о передаче параметров и возврате результата описано в разделе Процедурный механизм. Механизм регистровых окон обеспечивает возможность заведения локальных и рабочих переменных как автоматически сохраняемых и восстанавливаемых при процедурных вызовах. Это будет обеспечено только при условии того, что переменные не будут размещаться в области передачи параметров. Регистры области параметров могут быть изменены вызовом процедуры.

9.3.1.3. Пространство регистров подвижной базы. Программные соглашения использования базированных регистров

В текущем окне процедуры с помощью специального регистра BR может быть выделено отдельное подпространство со своей относительной адресацией. Регистр BR называется регистром подвижной базы. Организованное таким образом пространство регистров и есть регистры подвижной базы, или базированные регистры.

Регистр BR устанавливается относительно регистра WD. Максимально возможное смещение установки - 128 регистров. Максимальный размер области, описываемой регистром BR, составляет 128 регистров. Таким образом, с использованием регистров подвижной базы можно организовать доступ к регистрам текущего окна, недоступным адресацией относительно WD.

Ассемблерная мнемоника обращения к базированным регистрам:

%b[number]      - SR регистр
%db[number]     - DR регистр
%qb[number]     - QR регистр

где number – номер регистра относительно начала базированной области.

В пространстве базированных регистров аппаратно поддержан механизм вращения.

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

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

Наличие механизма вращения позволяет использовать базированные регистры в цикловых оптимизациях.

9.3.1.4. Пространство глобальных регистров. Программные соглашения использования глобальных регистров

Глобальные регистры реализованы на глобальной части регистрового файла. Адресация к глобальным регистрам осуществляется с помощью абсолютной адресации (при обращении адрес вычисляется по модулю 32). В старшей части адресов (с 24 по 31) глобальных регистров аппаратно поддержан механизм вращения.

Ассемблерная мнемоника обращения к глобальным регистрам:

%g[number]  - SR регистр
%dg[number] - DR регистр
%qg[number] - QR регистр

где number – абсолютный адрес в регистровом файле (0-31).

Глобальный регистр g13 используется для указателя TLS, g12 зарезервирован для дальнейших нужд, остальные используются в качестве scratch-регистров (не сохраняют значения при вызовах).

Поведение ОС:

  • регистры g12, g13 являются глобальными для потока, т.е. сохраняются/восстанавливаются только при переключении контекста;

  • все остальные регистры дополнительно сохраняются/восстанавливаются при входе в пользовательский обработчик сигналов.

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

9.3.2. Предикатные регистры

Предикатные регистры используются для управления вычислениями. Предикатные регистры могут содержать два значения: TRUE (1) или FALSE (0). Выполнение операций в условном режиме ставится в зависимость от значения предиката. Операция либо выполняется, либо не выполняется. Предикатные регистры располагаются в предикатном регистровом файле. Размер предикатного файла – 32 регистра. Адресация предикатных регистров осуществляется указанием абсолютного номера регистра в предикатном файле.

Ассемблерная мнемоника обращения к предикатным регистрам:

%pred[number]

где number - абсолютный номер регистра в предикатном файле (0 – 31).

При процедурных переходах весь предикатный регистровый файл сохраняется и при возврате восстанавливается. Таким образом, предикатные регистры являются локальными автоматическими объектами.

В предикатном файле может быть выделена область с вращающимся механизмом. Для этого требуется установить поле начала области и её размер в регистре BR.

9.3.3. Регистры управления

Регистры управления используются для организации переходов, в том числе и процедурных. В них содержится информация о типе перехода и адресе назначения. Формирование регистров управления осуществляется в операциях подготовки переходов. Использование – в операциях переходов. Регистры управления являются специальными регистрами и могут быть доступны по чтению и записи (только в привилегированном режиме) для операций доступа к специальным регистрам.

Существует три регистра управления. Ассемблерная мнемоника обращения к регистрам:

%ctpr[number]

где number может принимать значения 1,2,3.

Все типы перехода за исключением перехода типа RETURN (возврат из процедурного вызова) могут использовать любой из этих регистров управления. Возврат из процедурного вызова реализуется только на %ctpr3.

При процедурных переходах значения регистров не сохраняются.

9.3.4. Специальные регистры

Под специальными регистрами понимаются регистры процессора, используемые для организации вычислительного процесса. Здесь не будут рассматриваться все такие регистры, имеющиеся в архитектуре. В рассмотрение включены только регистры, доступные непривилегированной пользовательской задаче.

В нижеследующей таблице приведены описания регистров. Программные соглашения отражены в требованиях по сохранению значения регистров:

  • Auto. Регистры автоматически сохраняются и восстанавливаются при процедурных вызовах.

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

  • Special. Предполагается, что процедурный вызов не портит значение регистра. Соответственно, если в обычной процедуре значение регистра необходимо изменить, то при возврате должно быть восстановлено исходное значение. Это, однако, не относится к специально документированным процедурам, назначение которых состоит именно в известном изменении значения таких регистров.

С точки зрения доступа к регистру возможны варианты, которые отражены в виде следующей мнемоники: R/W/M. Позиция R означает возможность чтения содержимого регистра, W - возможность записи значения в регистр, M - возможность модификации регистра определенными командами. Если какая либо из возможностей отсутствует, в соответствующей позиции ставится прочерк.

Специальные регистры

Регистр

Описание

Доступ

Сохранение

WD

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

R/-/M

Auto

BR

Регистр подвижной базы в текущем окне регистрового файла. Сохраняется при вызове процедуры, восстанавливается при выходе из нее. В процедуре значение устанавливается операцией SETBN.

R/-/M

Auto

TR

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

R/-/M

Auto

PSR

Регистр состояния процессора. Содержит флаги, управляющие работой процессора. В частности, в регистре содержится признак привилегированного режима. Регистр недоступен для модификации в непривилегированном режиме.

R/-/-

?

UPSR

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

R/W/-

Special

IP

Адрес текущей команды. Изменяется в процессе вычислений и выполнения переходов.

R/-/M

Auto

NIP

Адрес следующей команды.

R/-/M

Auto

CTPR[1-3]

Регистры подготовки переходов. Не сохраняются при процедурных переходах. Изменяются операциями подготовки переходов.

R/-/M

Scratch

PFPFR

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

R/W/M

Special

FPFR

Статусный регистр вещественной арифметики. Содержит маски прерываний, накапливаемые флаги и правила вычислений. Накапливаемые флаги могут изменяться операциями вещественной арифметики.

R/W/M

Special

LSR

Статусный регистр цикла.

R/W/-

Scratch

ILCR

Регистр счетчика цикла.

R/W/-

Scratch

USD

Регистр указателя пользовательского стека в памяти. Модифицируется операциями заказа локальной памяти процедуры GETSP. Сохраняется и восстанавливается в процедурном механизме.

R/-/M

Auto

CUD

Сегментный регистр кода. Содержит базовый адрес текущего сегмента кода и размер области. При межмодульных процедурных переходах автоматически сохраняется и восстанавливается.

R/-/-

Auto

GD

Сегментный регистр данных. Содержит базовый адрес текущего сегмента данных и его размер. При межмодульных процедурных переходах автоматически сохраняется и восстанавливается.

R/-/-

Auto

TSD

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

R/-/-

Auto

CUIR

Регистр содержит индекс текущего загрузочного модуля (current compilation unit)

R/-/-

Auto

9.4. Локальный стек

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

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

Продвижение стека поддержано аппаратно. Для продвижения стека вперед (заказ памяти в стеке текущей процедуры) используются операции GETSP, GETSAP и GETSOD. Значение регистра USD продвигается этими операциями в соответствии с размером выделенной памяти. При возврате из процедуры автоматически восстанавливается прежнее значение регистра USD. Значение базового адреса из регистра USD может быть использовано в регулярных режимах как указатель стека.

В регулярном режиме для заказа памяти в стеке используется операция GETSP. Операции аргументом подается требуемый размер в байтах. Операция возвращает базовый адрес заказанной области, выровненный на 16 байт.

9.4.1. Процедурный фрагмент стека

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

Рисунок S-1. Области стека процедурного фрагмента
Области стека процедурного фрагмента

Области стека процедурного фрагмента

В области локальных переменных могут быть размещены собственно локальные переменные процедуры и рабочие ячейки, используемые процедурой. Область является недоступной для вызванных процедур. Хотя наличие этой области не является обязательным, обычно эта область всегда присутствует в процедурном фрагменте стека. Отсутствие этой области означает, что процедуре не требуется размещать никакие локальные данные в памяти.

Динамическая область предназначена для динамического выделения памяти процедуры, например, для реализации стандартной библиотечной функции alloca. Наличие этой области является необязательным.

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

  • в процедурах без вызовов;

  • в процедурах с вызовами, которые не требуют размещения параметров в памяти.

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

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

9.4.2. Доступ к компонентам фрагмента процедурного стека

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

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

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

9.5. Процедурный механизм

К процедурному механизму относится обеспечение процедурных переходов, способы передачи параметров и возврата результата вызова. Отметим, что в этом разделе не обсуждаются вопросы вызовов функций операционной системы.

9.5.1. Передача параметров

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

Размещение списка параметров на физические ресурсы осуществляется следующим образом. Первые 8 элементов размещаются в регистровом файле. При вызове должно быть обеспечено переключение регистра WD на регистр, в котором находится первый параметр. Это обеспечивается установками операции процедурного перехода. Регистр, в который помещается значение первого параметра, должен иметь четный номер, т.е. соответствовать выравниванию на квадро регистр. После выполнения процедурного перехода этот регистр будет иметь номер 0. Остальные элементы списка параметров передаются через область фактических параметров локального стека в памяти.

Рисунок P-1. Размещение списка параметров на физические ресурсы
Размещение списка параметров на физические ресурсы

Размещение списка параметров на физические ресурсы

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

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

Зависимость передачи параметров от интерфейса процедуры

При генерации кода компилятор вправе использовать и доверять информации об интерфейсе процедуры в точке ее вызова. Эта информация получается из заданного предописания процедуры. Возможен и анализ по вызову при отсутствии предописания. Все предописания можно разделить на три группы:

  • предописание со спецификацией всех параметров;

  • предописание со спецификацией переменного числа параметров;

  • предописание без спецификации параметров.

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

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

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

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

Зависимость размещения параметров в списке параметров от типа

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

Таблица. Правила размещения в списке параметров.

Правила размещения в списке параметров

Размер (байт)

Правило размещения

Число элементов списка

1-8

Следующий свободный

1

9-16

Следующий четный

2

17 и более

Следующий четный

(размер + 7)/8

Размещение «следующий свободный» означает, что параметр может быть размещен в очередном свободном элементе списка параметров. Размещение «следующий четный» означает, что параметр может быть размещен только в очередном свободном элементе списка параметров с четным номером. Если очередной свободный элемент имеет нечетный номер, то он должен быть пропущен (паддинг).

При размещении целочисленного параметра размера меньшего, чем int, в соответствии со стандартом языка делается расширение значения до int. Если параметр имеет размер меньше 8 байт, значение старших байтов не определено.

При размещении параметра скалярного типа размером больше 8 байт младшая часть параметра распределяется в элементе списка параметров с меньшим номером, старшая в элементе с большим номером.

Особо отметим, что хотя параметр типа __float80 с точки зрения регистров может быть размещен в одном элементе списка параметров, с точки зрения размера и размещения в памяти требуется два элемента списка параметров.

Если при размещении параметра только его часть может быть размещена в регистровом файле, весь параметр должен быть размещен в памяти.

Особенности передачи параметров в режиме 64

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

9.5.2. Возврат значения

Возврат значения производится либо через регистровый файл, либо через область памяти, выделенную вызывающей процедурой. В любом случае вызывающая процедура должна обеспечить необходимые ресурсы для возвращаемого значения. Если для вызова отсутствует предописание, то тип возвращаемого значения определяется по правилам языка (обычно int). Особо отметим случай вызова процедур без предописания, не использующих результат вызова. Для таких вызовов также необходимо обеспечить ресурсы для возвращаемого значения типа int.

Возврат значения размером не больше 64 байт производится через регистровый файл. Регистры для возврата значения начинаются с регистра %r0.

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

Особенности возврата значения в режиме 64

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

9.5.3. Процедурный переход

Процедурный переход осуществляется в два этапа. На первом этапе делается подготовка перехода, на втором собственно сам переход. На этапе подготовки перехода вычисляется адрес назначения перехода и тип перехода. На этапе перехода делается переключение контекста с сохранением необходимой информации в стеке связующей информации и переход на вычисленный адрес назначения.

Подготовка процедурного перехода

Для процедурного перехода возможны следующие подготовки:

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

  • MOVTD – подготовка по значению. Значение, которое определяет адрес перехода, подается аргументом операции и имеет формат двойного слова. В зависимости от значения и режима подготавливаются переходы разных типов.

    • Если значение имеет диагностические теги, подготавливается переход типа ctpdw (переход по диагностическому значению).

    • Иначе в регулярных режимах подготавливается переход типа ctpnl.

  • GETPL – подготовка по смещению относительно регистра CUD. Аргументом операции подается смещение адреса назначения относительно базового адреса регистра CUD. Формат аргумента - слово. В зависимости от значения и режима подготавливаются переходы разных типов.

    • Если значение имеет диагностические теги, подготавливается переход типа ctpdw.

    • Иначе в регулярных режимах подготавливается переход типа ctppl.

Все подготовки формируют код операции перехода disp.

Результат подготовки перехода записывается в любой из регистров управления (%ctprN, где N ={ 1, 2, 3}).

Выполнение процедурного перехода

Выполнение процедурного перехода реализуется операцией CALL. Операция принимает аргумент, который должен быть одним из регистров управления ctrpN, и параметры. Если подготовленный переход имеет тип ctpdw или ctpew, возникает прерывание.

При выполнении процедурного перехода автоматически сохраняется информация для возврата. Сохранение делается в стеке связующей информации. Сохраняются следующие значения:

  • адрес следующей команды, на которую будет произведен возврат (значение регистра nIP);

  • параметры текущего регистрового окна (регистры WD и BR);

  • предикатный файл;

  • состояние регистра CUIR;

  • состояние регистра TR;

  • состояние регистра USD;

  • состояние регистра PSR. Сохранение этого регистра необходимо только для целей обработки прерываний операционной системой.

Формируется новое значение регистра IP, которое вычислено в операции подготовки. Это значение находится в регистре управления, который подаётся аргументом в операцию перехода.

В регистры управления записываются типы переходов ctpew (переход по пустому значению).

Формируются новые значения контекста и регистровых файлов.

Переключение регистровых файлов

Переключение регистрового окна проиллюстрировано на рисунке R-1 (см. раздел Механизм регистровых окон). Параметром wbs для операции CALL задается величина смещения регистрового окна при вызове (значение M на рисунке R-1). Это значение не может быть больше размера текущего окна и не может быть меньше начального размера текущего окна (размера окна для передачи параметров). Если значение не удовлетворяет указанным условиям, переход не происходит и возникает прерывание.

При процедурном переходе формируется регистровое окно с размером, равным размеру области передаваемых параметров. Этот размер вычисляется как разность общего размера регистрового окна и значения смещения при вызове (параметр wbs операции CALL, значение M на рисунке R-1).

При процедурном переходе создается новый предикатный файл.

9.5.4. Возврат из процедуры

Возврат из процедуры осуществляется подготовленным переходом. Для этого используется операция подготовки RETURN. Операция из стека связующей информации загружает сохраненный адрес точки возврата. Подготовка формирует код операции перехода return. Результат операции может быть помещен только в регистр управления %ctpr3.

Выполнение возврата осуществляется операцией выполнения перехода CT. При выполнении операции восстанавливаются значения специальных регистров, сохраненные в стеке связующей информации.

Если индекс модуля адреса точки возврата отличается от индекса текущего модуля, производится переключение контекстных регистров TSD, GD и CUD.