Архитектура компьютера

Рубрика «Уровень микроархитектуры»

Компиляция IJVM

А теперь посмотрим, какое отношение язык Java имеет к IJVM. В листинге 4.1 представлен небольшой фрагмент программы на языке Java. Компилятор Java должен был бы переделать эту программу в программу на языке ассемблера IJVM, приведенную в листинге 4.2. Цифры с 1 по 15 в левой части листинга, а также комментарии после символов двойной косой черты (//) не являются частью самой программы. Они даны для наглядности и просто облегчают понимание. Затем ассемблер Java транслировал бы ее в программу в двоичном коде. Эта программа представлена в листинге 4.3. (В действительности результатом работы компилятора Java сразу является двоичный код.) В данном примере i — локальная переменная 1, j — локальная переменная 2, а к — локальная переменная 3.

Скомпилированная программа проста. Сначала j и к помещаются в стек, складываются, а результат сохраняется в i. Затем i и константа 3 помещаются в стек и сравниваются. Если они равны, то совершается условный переход к L1, где к получает значение 0. Если они не равны, то выполняется часть программы после команды IF_ICMPEQ. После этого осуществляется переход к L2, где объединяются части else и then.
Читать дальше »

Ваш отзыв

Набор IJVM-команд

Набор IJVM-команд приведен в табл. 4.2. Каждая команда состоит из кода операции и иногда из операнда (например, смещения адреса или константы). В первом столбце приводится шестнадцатеричный код команды. Во втором столбце дается мнемоника на языке ассемблера. В третьем столбце описывается назначение команды.

Команды нужны для того, чтобы помещать слова из различных источников в стек. Источники — это набор констант (LDC_W), фрейм локальных переменных (IL0AD) и сама команда (BIPUSH). Переменную можно также вытолкнуть из стека и сохранить во фрейме локальных переменных (ISTORE). Над двумя верхними словами стека можно совершать две арифметические (IADD и ISUB) и две логические операции (IAND и I0R). При выполнении любой арифметической или логической операции два слова выталкиваются из стека, а результат помещается обратно в стек. Существует 4 команды перехода: одна для безусловного перехода (GOTO), а три другие для условных переходов (IFEQ, IFLT и IFICMPEQ). Все эти команды изменяют значение PC на размер их смещения, который следует за кодом операции в команде. Операнд смещения состоит из 16 бит. Он прибавляется к адресу кода операции. Существуют также команды для перестановки двух верхних слов стека (SWAP), дублирования верхнего слова (DUP) и удаления верхнего слова (POP).
Читать дальше »

Ваш отзыв

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

А теперь мы можем рассмотреть архитектуру IJVM. Она состоит из памяти, которую можно рассматривать либо как массив из 4 294 967 296 байт (4 Гбайт), либо как массив из 1 073 741 824 слов, каждое из которых содержит 4 байта. В отличие от большинства архитектур команд, виртуальная машина Java не выполняет обращений к памяти, видимых на уровне команд, но имеет несколько неявных адресов, которые составляют основу указателя. IJVM-команды могут обращаться к памяти только через эти указатели. Определены следующие области памяти:

Набор констант. Эта область, недоступная для записи из IJVM-програм-мы, состоит из констант, строк и указателей на другие области памяти, на которые можно делать ссылку. Данная область загружается в момент загрузки программы в память и после этого не меняется. Имеется скрытый регистр СРР (Constant Pool Pointer — указатель набора констант), который содержит адрес первого слова набора констант.

Фрейм локальных переменных. Эта область предназначена для хранения переменных во время выполнения процедуры. Она, как уже отмечалось, называется фреймом локальных переменных. В начале этого фрейма располагаются параметры (или аргументы) вызванной процедуры. Фрейм локальных переменных не включает в себя стек операндов. Он помещается отдельно. Исходя из соображений производительности, мы поместили стек операндов прямо над фреймом локальных переменных. Существует скрытый регистр, который содержит адрес первой переменной фрейма. Мы назовем этот регистр LV (Local Variable — локальная переменная). Параметры вызванной процедуры хранятся в начале фрейма локальных переменных.
Читать дальше »

Ваш отзыв

Стек

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

К сожалению, предоставить каждой переменной абсолютный адрес в памяти невозможно. Проблема заключается в том, что процедура может вызывать себя сама. Мы рассмотрим такие рекурсивные процедуры в главе 5. А пока достаточно сказать, что если процедура вызывается дважды, то хранить ее переменные под конкретными адресами в памяти нельзя, поскольку второй вызов перемешается с первым.
Читать дальше »

Ваш отзыв

Пример архитектуры набора команд — IJVM

Чтобы продолжить изучение нашего примера, введем уровень архитектуры набора команд (ISA), которые должна интерпретировать микропрограмма машины IJVM (см. рис. 4.5). Для удобства уровень архитектуры команд мы иногда будем называть макроархитектурой, чтобы противопоставить его микроархитектуре. Однако перед тем как приступить к описанию IJVM, мы немного отвлечемся.

Ваш отзыв

Управление микрокомандами — микроархитектура Mic-1

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

Контроллер последовательности в каждом цикле должен выдавать следующую информацию:

♦ состояние каждого сигнала управления в системе;

♦ адрес микрокоманды, которая будет выполняться следующей.

Рисунок 4.5 представляет собой подробную диаграмму полной микроархитектуры нашей машины, которую мы назвали Mic-1. Хотя на первый взгляд она может показаться внушительной, ее нужно подробно изучить. Если вы разберетесь во всех блоках и их связях, изображенных на этом рисунке, вам легче будет понять структуру уровня микроархитектуры. Диаграмма состоит из двух частей: тракта данных (слева), который мы уже подробно обсудили, и блока управления (справа), который мы рассмотрим сейчас.
Читать дальше »

Ваш отзыв

Микрокоманды

Для управления трактом данных, изображенным на рис. 4.1, нам нужно 29 сигналов. Их можно разделить на пять функциональных групп:

♦ 9 сигналов для записи данных с шины С в регистры;

♦ 9 сигналов для разрешения передачи регистров на шину Вив АЛУ;

♦ 8 сигналов для управления АЛУ и схемой сдвига;

♦ 2 сигнала, которые указывают, что нужно осуществить чтение или запись через регистры MAR/MDR (на рисунке они не показаны);

♦ 1 сигнал, который указывает, что нужно осуществить вызов из памяти через регистры PC/MBR (на рисунке также не показан).

Значения этих 29 сигналов управления определяют операции для одного цикла тракта данных. Цикл состоит из передачи значений регистров на шину В, прохождения этих сигналов через АЛУ и схему сдвига, передачи полученных результатов на шину С и записи их в нужный регистр (регистры). Кроме того, если установлен сигнал считывания данных, то в конце цикла после загрузки регистра MAR начинает работать память. Данные из памяти помещаются в MBR или MDR в конце следующего цикла, а использоваться эти данные могут в цикле, который идет после него. Другими словами, если считывание из памяти через любой из портов начинается в конце цикла k, то полученные данные не смогут использоваться в цикле k + 1 (только в цикле k + 2 и позже).
Читать дальше »

Ваш отзыв

Функционирование памяти

Наша машина может взаимодействовать с памятью двумя способами: через порт с пословной адресацией (32-разрядный) и через порт с побайтовой адресацией (8-разрядный). Порт с пословной адресацией управляется двумя регистрами: MAR (Memory Address Register — адресный регистр памяти) и MDR (Memory Data Register — информационный регистр памяти), которые показаны на рис. 4.1. Порт с побайтовой адресацией управляется регистром PC, который записывает 1 байт в 8 младших битов регистра MBR (Memory Buffer Register — буферный регистр памяти). Этот порт может считывать данные из памяти, но не может записывать их в память.

Каждый из этих регистров, а также все остальные регистры, изображенные на рис. 4.1, запускаются одним из сигналов управления. Белая стрелка под регистром указывает на сигнал управления, который разрешает передавать выходной сигнал регистра на шину В. Регистр MAR не связан с шиной В, поэтому у него нет разрешающего сигнала управления. У регистра Н этого сигнала тоже нет, так как он является единственным возможным левым входом АЛУ и поэтому всегда разрешен.
Читать дальше »

Ваш отзыв

Синхронизация тракта данных

Как происходит синхронизация этих действий, показано на рис. 4.2. Здесь в начале каждого цикла генерируется короткий импульс. Он может выдаваться задающим генератором, как показано на рис. 3.20, в. На спаде импульса устанавливаются биты, которые будут запускать все вентили. Этот процесс занимает определенный отрезок времени △w. Затем выбирается регистр, и его значение передается на шину В. На это требуется время △х. Далее АЛУ и схема сдвига начинают оперировать поступившими к ним данными. После промежутка △у выходные сигналы АЛУ и схемы сдвига стабилизируются. В течение следующего отрезка, △г, результаты проходят по шине С к регистрам, куда они загружаются на фронте следующего импульса. Загрузка должна запускаться фронтом сигнала и осуществляться мгновенно, так что даже в случае изменений каких-либо входных регистров изменения в шине С будут происходить только после полной загрузки регистров. На фронте импульса регистр, запускающий шину В, приостанавливает свою работу и ждет следующего цикла. На рисунке имеются еще регистры МРС и MIR, а также память. Их предназначение мы обсудим чуть позже.

Важно понимать, что хотя в тракте данных нет никаких запоминающих элементов, для прохождения сигнала по нему требуется определенное время. Изменение значения на шине В вызывает изменения на шине С не сразу, а только после паузы (это объясняется задержками на каждом шаге). Следовательно, даже если один из входных регистров изменяется, новое значение сохраняется в регистре задолго до того, как старое (и уже неправильное) значение этого регистра, помещенное на шину В, сможет достичь АЛУ.
Читать дальше »

Ваш отзыв

Тракт данных

Тракт данных — это часть центрального процессора, состоящая из АЛУ (арифметико-логического устройства), его входов и выходов. Тракт данных нашей микроархитектуры показан на рис. 4.1. Хотя этот тракт данных и был оптимизирован для интерпретации IJVM-программ, он схож с трактами данных большинства компьютеров. Тракт содержит ряд 32-разрядных регистров, которым мы приписали символические названия (например, PC, SP, MDR). Хотя некоторые из этих названий нам знакомы, важно понимать, что эти регистры доступны только на уровне микроархитектуры (для микропрограммы). Им даны такие названия, поскольку они обычно содержат значения, соответствующие переменным с аналогичными названиями на уровне архитектуры команд. Содержание большинства регистров передается на шину В. Выходной сигнал АЛУ управляет схемой сдвига и далее шиной С. Значение с шины С может записываться в один или несколько регистров одновременно. Шину А мы введем позже, а пока представим, что ее нет.
Читать дальше »

Ваш отзыв