Модель оперативной памяти
Объем адресного пространства памяти, к которому теоретически могут выполняться обращения к программе определяется разрядностью представления адреса. Однако, реально в целевой ВС может быть значительно меньший объем памяти. Во встроенных ВС адресное пространство может покрываться реальной памятью несмежными фрагментами, причем фрагменты реальной памяти могут быть как ОЗУ, так и ПЗУ.
Интерпретатор должен "знать" конфигурацию реальной памяти в целевой ВС. Возможные варианты задания такой конфигурации:
- Потребовать, чтобы любая ячейка памяти, к которой обращается программа, была описана в программе (директивой DD или BSS).
- Описать конфигурацию памяти в отдельном файле, являющимся входным для Интерпретатора.
Представляется, что второй подход более универсальный, так как:
- обращение в программе по неописанному в ней адресу памяти возможно (особенно это касается программ для встроенных ВС с абсолютными программами и жестки распределением памяти);
- определение памяти в программе также является объектом проверки/отладки может содержать ошибки;
- в Ассемблере нет средств описания ОЗУ/ПЗУ.
Внешнее описание памяти считывается Интерпретатором в начале работы и превращается в таблицу фрагментов вида:
Оперативная память целевой ВС представляется памятью (не обязательно оперативной) исходной ВС. Однако, в модели памяти на исходной ВС мы имеем возможность помимо собственно данных, хранящихся в целевой памяти, представлять также и описание этих данных. Каждый байт целевой памяти представляется двумя байтами исходной памяти. В первом байте представления хранятся собственно данные, а во втором - ряд признаков, характеризующих ячейку целевой памяти. Среди этих признаков могут быть такие:
a | признак 1-го байта команды (управление можно передавать только на 1-й байт команды); |
b | признак команды/данных |
c | признак инициализированных/неинициализированных данных |
d | признак изменяемых/неизменяемых данных |
e | признак останова при передаче управления |
f | признак останова при передаче записи |
g | признак останова при передаче чтении |
h | и т.д. |
Все названные признаки - однобитные. Признаки a, b устанавливаются Кросс-ассемблером при трансляции программы и не изменяются при выполнении. Признак с устанавливается Кросс-ассемблером, но может изменяться Интерпретатором в процессе выполнения. Признак d устанавливается Интерпретатором перед началом выполнения на основе таблицы фрагментов и, возможно, дополнительной информации, вводимой программистом (отдельно от программы) и может изменяться программистом в ходе интерактивной отладки. Признаки e-f устанавливаются перед началом выполнения на основе дополнительной информации и может изменяться программистом в ходе интерактивной отладки.
Дополнительная информация о памяти, таким образом, состоит из таблицы фрагментов, списка переменных в ОЗУ, которые не разрешается изменять, списка переменных, при обращении к которым должен происходить останов, и меток, при передаче управления на которые должен происходить останов.
Каждое обращение к памяти в программе характеризуется типом: R (чтение), W(запись) или X(передача управления). При любом типе обращения проверяется попадание в реально существующий фрагмент памяти. При обращении типа X проверяется бит a признака, управление может быть передано только на байт с установленным признаком a. При обращениях типа R и W проверяется бит b признака, обращения этого типа могут происходить только к данным При обращениях типа R проверяется бит c признака, читаться могут только инициализированные данные При обращениях типа W проверяется бит d признака, данные должны быть изменяемые, бит с признака при этом устанавливается, т.е. данные становятся инициализированными.