«Виртуальным (virtual) называется ресурс, который пользовательской программе представляется обладающим свойствами отличными от тех, что она действительно имеет» [Бек].
Пользовательская программа использует виртуальную память (или виртуальное адресное пространство), которая отображается в реальную (физическую). Это означает, что при обращении к памяти виртуальный адрес преобразуется в реальный (физический).
Перевод виртуальных адресов в реальные называется динамическим преобразованием адресов.
Поскольку физическая память разделена на страницы, то удобно отображать виртуальную память на физическую постранично. Для каждого процесса в операционной системе имеется своя таблицы отображения страниц PMT – Page Map Table.
Разделение памяти на страницы также используется для экономии оперативной физической памяти. Загрузка страниц из внешней памяти в оперативную производится по необходимости, то есть если страница потребовалась пользовательской программе.
При «выталкивании» страницы из оперативной памяти она переписывается во внешнюю память только если она была модифицирована с момента загрузки. Информация о факте модификации страницы также хранится в таблице отображения страниц.
При нехватке оперативной памяти операционной системе приходится выталкивать оттуда часть виртуальных страниц. Для выбора выталкиваемой страницы могут использоваться различные алгоритмы. Это могут быть страницы, обращение к которым наименее вероятно, например, те, которые были загружены достаточно давно и к которым обращались достаточно редко. Счетчик количества обращений к странице также может размещаться в таблице отображения страниц.
Еще один пример алгоритма выбора выталкиваемой страницы – метод выталкивания дольше всего не использованной страницы LRU – Least Recently Used. Для применения этого метода фиксируются времена последнего обращения к странице и выталкивания выбирается та страница, к которой дольше всего не было обращений.
ARM поддерживает аппаратное переключение контекстов процессов. Для этого используется регистр 13 сопроцессора CP15, названный FCSE (Fast Context Switch Extension) PID (Process Identifier) (см. Рис. 1).
Биты 31:25 регистра 13 CP15 содержат идентификатор процесса: FCSE PID.
При обращении процессора к ячейке памяти с виртуальным адресом VA в диапазоне 0 - 32 MB вызывает преобразование этого адреса в модифицированный виртуальный адрес MVA.
Адрес MVA вычисляется по формуле:
MVA = VA + (FCSE_PID * 32 MB)
Модифицированный виртуальный адрес используется в MMU и в кэш-памяти.
Рисунок 1. Вычисление виртуального адреса по виртуальному адресу процесса
- маппирование диапазонов, доменов и схема защиты доступа;
- диапазон маппирования: 1 MB (секции), 64KB (большие страницы), 4KB (малые страницы), 1KB (tiny - крошечные страницы).
- разрешение доступа к секциям;
- разрешение доступа к большим и малым страницам – на уровне подстраниц (четверти страниц);
- 16 доменов, реализованных аппаратно;
- возможность задания 64 буферов для инструкций и 64 буферов для данных в TLB;
- аппаратное переключение страниц;
- round-robin (циклический) алгоритм вытеснения страниц;
- возможность выключить все TLB посредством регистра сопроцессора (регистр 8);
- возможность выключить буфер TLB, выбранный MVA, посредством регистра сопроцессора (регистр 8);
- независимый захват TLB инструкций и TLB данных посредством регистра сопроцессора (регистр 10).
Регистр |
Номер |
Биты |
Описание |
Control |
1 |
M,A,S,R |
Bit M – включить MMU; A – включить проверку выравнивания адресов данных; S,R – управление схемой защиты доступа |
Translation table base |
2 |
31:14 |
Содержит физический адрес таблицы трансляции в основной памяти. Адрес должен быть кратен 214 |
Domain access control |
3 |
31:0 |
Содержит 16 2-битовых полей. Каждое поле определяет атрибуты доступа к одному из 16 доменов (D15-D0) |
Fault status |
5 (I и D) |
7:0 |
Указывает на причину Data или Prefetch Abort (3:0), а также на номер домена, обращение к которому послужило причиной Abort’а (7:4). |
Fault address |
6 (D) |
31:0 |
Содержит виртуальный адрес (VA), обращение по которому вызвало Data Abort. |
TLB operations |
8 |
31:0 |
Запись в этот регистр вызывает выполнение MMU операций с TLB (translation lookaside buffers). |
TLB lockdown |
10 (I и D) |
31:20 и 0 |
Позволяет захватить определенные страницы в TLB, а также читать/писать victim (могущие быть сброшенными) индексы. |
Таблица 1. Регистры сопроцессора CP15, программирующие MMU
Пример TTB (Translation table base):
TTB:
.data 0x80000D9E – смещение физического адреса для виртуальных адресов 0 - (2^14-1)
.data 0x80004D9E – смещение физического адреса для виртуальных адресов 2^14 - (2^15-1)
.data 0x84000D92
.data 0x84004D92
.data 0x84008D92
.data 0x8400CD92
.data 0x84010D92
...
Преобразование MVA в физический адрес происходит в один-два этапа:
Извлечение типа адресации из TTB (таблицы трансляции, адрес которой задается регистром 2 сопроцессора CP15).
Если тип адресации страничный, то извлечение физического адреса из таблицы страниц.
Таблица трансляции адресов TT (translation table). Адрес этой таблицы программируется регистром TTB (translation table base): регистром 2 сопроцессора CP15. Биты 31:14 этого регистра задают адрес TT. Это значит, что адрес таблицы TT должен быть кратен 214.
TTB содержит 4096 32-битных ячеек, каждая из которых описывает 1 MB виртуальной памяти (таким образом можно адресоваться к 4 GB виртуальной памяти).
30-битный адрес (младшие два бита равны 0) ячейки TT вычисляется так: к битам 31:14 регистра TTB приписываются биты 31:20 адреса MVA.
Содержимое ячейки TT описано в таблице 2.
Биты 1:0 ячейки TT содержат тип адресации:
00 – неудача
01 – по грубой таблице страниц
10 – по секции
11 – по точной таблице страниц
Биты 8:5 определяют номер домена.
При адресации по секции биты 31:20 ячейки TT содержат базовый адрес 1 MB памяти. В этом случае MVA прямо используется как физический адрес.
При адресации по грубой таблице страниц биты 31:10 ячейки TT содержат базовый адрес грубой таблицы страниц. Биты 19:12 адреса используются в качестве индекса в грубой таблице страниц, биты 11:0 – смещение относительно адреса, извлеченного из грубой таблицы страниц.
При адресации по точной таблице страниц биты 31:12 ячейки TT содержат базовый адрес грубой таблицы страниц. Биты 19:10 адреса используются в качестве индекса в точной таблице страниц, биты 9:0 – смещение относительно адреса, извлеченного из точной таблицы страниц.
Биты |
Описание |
||
По секциям |
По грубой таблице |
По точной таблице |
|
31:20 |
31:10 |
31:12 |
Формируют соответствующие биты физического адреса |
19:20 |
- |
- |
Должны быть 0 |
11:10 |
- |
- |
Тип разрешения доступа |
9 |
9 |
11:9 |
Должны быть 0 |
8:5 |
8:5 |
8:5 |
Биты номера домена |
4 |
4 |
4 |
Должен быть 1 |
3:2 |
- |
- |
Кэшируемость области памяти: кэшируемая write-back, кэшируемая write-through, некэшируемая буферизуемая или некэшируемая небуферизуемая. |
- |
3:2 |
3:2 |
Должны быть 0 |
1:0 |
1:0 |
1:0 |
Тип адресации |
Таблица 2. Формат ячейки таблицы трансляции TT.
Грубая таблица страниц содержит 256 входов, разбивающих 1 MB памяти на 256 блоков по 4 KB. Служит для адресации к большим и малым страницам.
Точная таблица страниц содержит 1024 входа, разбивающих 1 MB памяти на 1024 блоков по 1 KB. Служит для адресации к крошечным страницам.
Биты |
Описание |
||
Большие страницы |
Малые страницы |
Крошечные страницы |
|
31:16 |
31:12 |
31:10 |
Формируют соответствующие биты физического адреса |
15:12 |
- |
9:6 |
Должны быть 0 |
11:4 |
11:4 |
5:4 |
Тип разрешения доступа |
3:2 |
3:2 |
3:2 |
Кэшируемость области памяти: кэшируемая write-back, кэшируемая write-through, некэшируемая буферизуемая или некэшируемая небуферизуемая. |
1:0 |
1:0 |
1:0 |
Тип страницы: неверная, большая, малая, крошечная |
Таблица 3. Формат ячейки таблицы страниц.
Значение |
Тип |
Описание |
00 |
Нет доступа |
Любой доступ вызывает ошибку домена |
01 |
Клиент |
Доступ определяется битами доступа в дескрипторе секции или страницы |
10 |
Зарезервировано |
В данный момент поведение как в пункте «нет доступа» |
11 |
Менеджер |
Доступ не проверяется, ошибка неразрешенного доступа не генерируется |
Таблица 4. Интерпретация битов управления доступом в регистре контроля домена (3)
Каждая таблица TLB содержит 64 модифицированных виртуальных адреса, результаты их трансляции в физический адрес и информацию о доступе к этим адресам.
Если TLB не содержит транслированный адрес для MVA, то после трансляции адреса он добавляется в таблицу.
Чтобы включить MMU:
Программируется TTB и регистры доступа к доменам.
Программируются таблицы страниц уровней 1 и 2.
Включается MMU заданием бита 0 в контрольном регистре.
После включения MMU несколько следующих выполняемых инструкций имеют старые адреса.
Одновременно с включением MMU можно включить кэш-память.
При выключении MMU кэш данных должен быть выключен заранее или одновременно.
TLB сохраняется при включениях и выключениях MMU, поэтому при необходимости ее надо выключить до включения MMU.