§ Таблицы и каталоги страниц
В программе можно использовать любое количество страниц памяти, но все они должны быть явно определены. Для описания страницы используется 4-х байтовая структура данных, состоящая из физического адреса, на который отображена страница и флагов, определяющих свойства этой страницы. Т.к. страница должна быть выравнена на границу 4-х килобайт, то адрес её начала всегда будет содержать нули в младших 12 битах (12 бит - это 2 12, т.е. 4096). Следовательно, информация о 32-разрядном адресе начала страницы находится в старших 20 разрядах - они и хранятся в описании страницы.Описания страниц группируются в таблицы страниц - массивы, размером в 4Кб, состоящие из 1024 элементов. Таблица страниц должна быть выравнена на границу 4Кб и она хранит описания 1024 страниц, что позволяет описать 4 Мегабайта адресного пространства (1024 страниц по 4Кб каждая).
Таблицы страниц группируются в каталог страниц - массив, размером в 4Кб, также состоящий из 1024 элементов. Каждый такой элемент является указателем на таблицу страниц. Т.к. таблица страниц выравнена на 4Кб, то указатель на неё содержит 20 старших бит адреса её начала и 12 бит флагов (указатель на таблицу страниц похож по формату на описание страницы). Каталог страниц позволяет описать всё 32-разрядное адресное пространство (1024 таблицы страниц, описывающих по 4Мб).
Программе совсем не обязательно определять все страницы, таблицы и элементы каталога. Достаточно определить только те, которые реально будут использоваться и динамически добавлять / убирать новые описания в процессе работы. Однако, обязательно нужно определить каталог страниц, а в нём - хотя бы один указатель. То же самое касается таблиц страниц - хотя бы одну с одним элементом.
Для того, чтобы указать номер страницы в таблице страниц, необходимо 10-разрядное значение (т.к. в таблице хранится 1024 описания, т.е. 2 10). Для того, чтобы указать какая именно таблица в каталоге страниц будет использоваться, также требуется 10-разрядное значение. Для того, чтобы указать смещение внутри страницы, необходимо 12-разрядное значение.
Если сложить размеры этих значений, то получается, что для доступа к памяти нужно задать 32-разрядную структуры данных: 10 бит - номер таблицы, ещё 10 - номер страницы в таблице и 12 - смещение снутри самой страницы.
Процессор использует описания страниц автоматически. Для этого он преобразует линейные адреса по следующей схеме:
Вот так и происходит преобразование линейного адреса в физический. Если все логические страницы отображены тождественно, т.е. их линейные и физические адреса совпадают, то можно говорить о том, что линейный адрес равен физическому.
При программировании вам не понадобится "особым образом" конструировать линейные адреса - всё остаётся по прежнему. Процессор сам преобразовывает все адреса, используя таблицы и описания страниц и программа даже и "не подозревает" о том, что это преобразование происходит.
С точки зрения защиты целостности ОС, страничное преобразование является очень удачным дополнением к существующему механизму защиты, т.к. программа не знает, по какому именно физическому адресу она расположена и куда производит обращение и, следовательно, не сможет целенаправленно воздействовать на код и данные.