July 28th, 2013

Лабораторная работа 6: знакомство с промышленной реализацией архитектуры MIPS на примере pic32 (2)

Продолжение, начало Лабораторная работа 6: знакомство с промышленной реализацией архитектуры MIPS на примере pic32 (1) <<

Структура памяти

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

Большинство особенностей подобного рода лежит за пределами спецификаций архитектуры MIPS. Какие конкретно это будут устройства, интерфейсы и подсистемы и каким образом они будут связаны между собой определяет каждый производитель системы на кристалле самостоятельно (мы в своей реализации системы с процессором сделали по-своему, Microchip в своем pic32 - по-своему). А т.к. из прошлых занятий мы уже давно узнали, что основной способ взаимодействия ядра процессора с внешним миром - это шина инструкций и шина данных, т.е. внешняя память, то вполне логично, что многие особенности конкретного чипа в полной мере отразятся на том, каким образом эта самая память организована.

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

Как делали мы

Итак, вспомним, каким образом выглядела память в финальной реализации нашего процессора со всей обвязкой, необходимой для тестового запуска на ПЛИС:



На схеме видим следующее:
1. Вся доступная память разделена на два независимых адресных пространства - Память инструкций (Instruction memory) и Память данных (Data memory).
2. Каждое адресное пространство может теоретически содержать максимум по 4 Гб данных (32бит на адрес) - это виртуальная память.
3. Реально доступной физической памяти гораздо меньше, при этом она разбита на несколько блоков, которые раскиданы по разным виртуальным адресам.
4. Адреса для блоков физической памяти назначаются не случайно - для каждого адреса назначена специальная роль, заранее определенная в спецификации на контроллер.

Блоки на картинке:
1. ROM (Prog) - Read Only Memory - блок памяти, доступной только для чтения, содержащий код выполняемой процессором программы. Как помним, этот блок извне вообще неизменяем, сохраняет все содержимое при отключении питания схемы, прошивается в ПЛИС вместе с остальными частями аппаратного дизайна.
2. Он же - блок BOOT - загрузчик - блок памяти, содержащий код, который процессор начинает выполнять в момент подачи питания. В нашем максимально упрощенном случае от загрузчика никаких специальных действий не требуется, поэтому он просто совпадает с основным кодом программы.
3. RAM (Data) - Random Access Memory - блок памяти для произвольного чтения и записи данных. Оперативная память для данных - содержимое сбрасывается при отключении питания схемы.
4. I/O Devices - устройства ввода-вывода. Блок памяти с подключенными устройствами ввода-вывода. Хотя памятью его можно называть совсем условно, т.к. подключенные устройства могут вообще говоря ничего не запоминать, программный интерфейс позволяет скрыть подобные различия.

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

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

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

Итого нейтрального: память инструкций и память данных разделены на два непересекающихся и вообще независимых адресных пространства. Ничего принципиально хорошего в этом нет - просто в процессе создания дизайна память инструкций и память данных у нас находились в разных модулях и у нас также не было особых причин их специально объединять. Впрочем, ничего принципиально плохого в этом тоже нет, однако дальше мы увидим, что в реальных устройствах (в частности в pic32) они обычно объеденены внутри единого адресного пространства в силу дополнительных объективных причин.

Как реализовано в PIC32

Для pic32 схема организации памяти выглядит следующим образом (для пространства физических адресов):


Collapse )


Продолжение Лабораторная работа 6: знакомство с промышленной реализацией архитектуры MIPS на примере pic32 (3) >>