§ Страничная организация памяти
При обращении к памяти процессор всегда использует пару значений - селектор:смещение (в защищённом режиме сегменты определяются селекторами соответствующих дескрипторов и механизм управления памятью возможно реализовать только в защищённом режиме). Как правило, селектор находится в сегментном регистре, смещение - в регистре общего назначения, а при обращении к памяти программисты стараются использовать селекторы по умолчанию, т.к. такие команды выполняются максимально быстро. На самом деле адрес в памяти можно указать другими способами - через константы и значения переменных, но всегда используется пара значений селектор:смещение, в явном или неявном виде. Адрес, указанный таким образом называется логическим адресом, т.к. смещение задаётся относительно начала сегмента, размещённого по любому адресу.Каждый раз, при выполнении команды, процессор производит преобразование логического адреса в линейный адрес - 32-разрядный абсолютный адрес в памяти. С линейными адресами вы уже сталкивались, когда определяли дескрипторы и регистры IDTR и GDTR, задавая базовые адреса этих объектов.
После вычисления линейного адреса процессор преобразует его в физический адрес, по которому и производит обращение к памяти.
Возникает вопрос - а зачем нужен физический адрес, если линейный и так уже однозначно определяет доступ в память? Действительно, в контексте рассмотренного материала в предыдущих разделах это - не нужно. Тем не менее, процессор производит двухэтапное преобразование адреса каждый раз, когда производится обращение к памяти. Смысл в использовании линейных и физических адресов появляется, когда программа включает в процессоре механизм трансляции страниц.
Страницей называется непрерывная область памяти фиксированного размера. Впервые страничная организация памяти появилась в процессоре Intel386, где предоставилась возможность использования страниц размером в 4Кб. С появлением Pentium-а и Pentium Pro стало возможным использовать страницы размером в 2 и 4 мегабайта, но мы рассмотрим это позже, в следующих главах.
Итак, страница - это 4Кб-область памяти. Всё адресное пространство можно разбить на страницы (что, вообще говоря, и делается), получается 2 20 страниц (т.е. 1048576 или 1М), которые полностью покрывают 32-разрядное адресное пространство:
Адрес страницы памяти всегда кратен 4Кб (1000h байт), т.е. страница может начинаться только с адреса, у которого младшие 3 hex-разряда (или младшие 12 двоичных разрядов) равны нулю.
Физическая память - эта та, которая реализована в компьютере в виде микросхем. Вся физическая память делится на физические страницы. Адресное пространство равно 4Гб и оно делится на логические страницы. Таким образом, логические страницы соответствуют физическим страницам или другими словами, логические страницы отображаются на физические страницы.
Страница обладает одним очень важным свойством: она имеет свой логический адрес, но может быть отображена на любой физический адрес.
Логические страницы являются виртуальными объектами (т.е. реально не существующими) и каждая такая страница имеет два адреса:
- линейный - тот, по которому она расположена в адресном пространстве процессора,
- физический - тот, на который она отображена в физической памяти компьютера.
Теперь очевидна необходимость в преобразовании линейного адреса в физический, т.к. заранее неизвестно, на какую физическую страницу памяти отображена данная логическая страница.
Работа со страницами, в принципе, проста - указать процессору, какая именно страница используется и задать 12-разрядное смещение внутри неё.
В качестве примера использования страничной организации ниже приводится рис. 1-3, на котором показано размещение двух сегментов памяти, размером 16Кб и 12Кб:
Как видите, это очень удобно.
Благодаря страничной организации памяти стало возможным реализовать механизм виртуальной памяти на с управлением уровне процессора. Объём физической памяти в современных компьютерах значительно меньше 4Гб, но за счёт того, что логическую страницу памяти можно отобразить ещё и на дисковое пространство, при этом убрав её содержимое из физической памяти, размер реально используемой памяти значительно возрастает и уже ограничен размером винчестера (или пропускной способностью сети в "сетевом компьютере", не имеющим дисковой подсистемы).