Виртуальная память представляет собой непрерывную для пользователя, с ней работающего, область памяти, которая может быть вложена в другую виртуальную память. Виртуальная память состоит из сегментов, связанных между собой в двунаправленную цепь. Каждому сегменту известно его положение относительно нижнего логического уровня. Работа с виртуальной памятью происходит через канал, выделенный для нее. Канал – это набор характеристик описывающих: где расположена виртуальная память, и в каком ее месте мы находимся. Количество каналов ограничено, поэтому канал выделяется той виртуальной памяти, которая нужна в данный момент. Система имеет набор каналов, которые могут иметь ссылку на виртуальную память, либо быть незанятыми. Первые 5 каналов – это базовые каналы, отображенные на физические носители (оперативная память, файл). Вторые 5 каналов – каналы виртуальной памяти, хранящие каталоги объектов. Остальные каналы предназначены для работы с объектами. Все каналы основываются на каких-либо других каналах, образуя, в общем случае, 5 независимых деревьев. Корень – один из базовых каналов (0..4). Одна и та же виртуальная память не может быть загружена в два канала. При переходе от верхнего канала к нижнему выполняется трансляция адреса.
Рис 3: Связь каналов с хранилищами объектов
Таблица 2: Параметры канала
Параметр канала |
Семантика |
NCHAN |
Номер текущего канала |
LOWCH |
Нижний канал; в него вложен этот канал |
CHGCTX |
Признак изменения данных заголовка фрагмента |
TEKADR |
Текущая позиция для чтения/записи |
SYNCADDR |
Адрес начала заголовка текущего сегмента в нижнем канале |
TEKADR0 |
Позиция, соответствующая началу данных фрагмента |
PREDADDR |
Адрес заголовка предыдущего фрагмента (–1, если его нет) |
NEXTADDR |
Адрес заголовка следующего фрагмента (–1, если его нет) |
BUSYLEN |
Занятая длина |
LEN |
Выделенная длина |
Таблица 3: Операции доступа к данным виртуальной памяти
Операция |
Семантика (все операции работают с текущим каналом) |
IBS |
Чтение байта из канала |
OBS |
Запись байта в канал |
GOTO |
Переход по адресу в канале |
@GOTO |
Переход по смещению в канале |
UPSIZE |
Выделить доп. память в конце канала и встать на ее начало |
DEFRAG |
Сделать виртуальную память непрерывной на уровне нижнего канала (т.е. однофрагментной) |