§ Страничная организация памяти

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

Адрес страницы памяти всегда кратен 4Кб (1000h байт), т.е. страница может начинаться только с адреса, у которого младшие 3 hex-разряда (или младшие 12 двоичных разрядов) равны нулю.
Физическая память - эта та, которая реализована в компьютере в виде микросхем. Вся физическая память делится на физические страницы. Адресное пространство равно 4Гб и оно делится на логические страницы. Таким образом, логические страницы соответствуют физическим страницам или другими словами, логические страницы отображаются на физические страницы.
Страница обладает одним очень важным свойством: она имеет свой логический адрес, но может быть отображена на любой физический адрес.
Логические страницы являются виртуальными объектами (т.е. реально не существующими) и каждая такая страница имеет два адреса:
  • линейный - тот, по которому она расположена в адресном пространстве процессора,
  • физический - тот, на который она отображена в физической памяти компьютера.
Если линейный адрес совпадает с физическим, то говорят, что страница тождественно отображена. На рис. 1-2 поясняется отображение логических страниц на физические:

Теперь очевидна необходимость в преобразовании линейного адреса в физический, т.к. заранее неизвестно, на какую физическую страницу памяти отображена данная логическая страница.
Работа со страницами, в принципе, проста - указать процессору, какая именно страница используется и задать 12-разрядное смещение внутри неё.
В качестве примера использования страничной организации ниже приводится рис. 1-3, на котором показано размещение двух сегментов памяти, размером 16Кб и 12Кб:

Как видите, это очень удобно.
Благодаря страничной организации памяти стало возможным реализовать механизм виртуальной памяти на с управлением уровне процессора. Объём физической памяти в современных компьютерах значительно меньше 4Гб, но за счёт того, что логическую страницу памяти можно отобразить ещё и на дисковое пространство, при этом убрав её содержимое из физической памяти, размер реально используемой памяти значительно возрастает и уже ограничен размером винчестера (или пропускной способностью сети в "сетевом компьютере", не имеющим дисковой подсистемы).