Данный метод представляет собой комбинацию страничного и сег-ментного ме-ханизмов управления памятью и направлен на реализацию дос-тоинств обоих подходов.
Так же как и при сегментной организации памяти, виртуальное адрес-ное про-странство процесса разделено на сегменты. Это позволяет определять разные права доступа к разным частям кодов и данных программы.
Перемещение данных между памятью и диском осуществляется не сегментами, а страницами. Для этого каждый виртуальный сегмент и физи-ческая память де-лятся на страницы равного размера, что позволяет более эф-фективно использо-вать память, сократив до минимума фрагментацию.
В большинстве современных реализации сегментно-страничной орга-низации па-мяти в отличие от набора виртуальных диапазонов адресов при сегментной орга-низации памяти (рис. 5.20, а) все виртуальные сегменты об-разуют одно непре-рывное линейное виртуальное адресное пространство (рис. 5.20, б).
Координаты байта в виртуальном адресном пространстве при сег-ментно-стра-ничной организации можно задать двумя способами. Во-первых, линейным вир-туальным адресом, который равен сдвигу данного байта отно-сительно границы общего линейного виртуального пространства, во-вторых, парой чисел, одно из которых является номером сегмента, а другое - смеще-нием относительно начала сегмента. При этом в отличие от сегментной мо-дели, для однозначного задания виртуального адреса вторым способом необ-ходимо каким-то образом
указать также начальный виртуальный адрес сег-мента с данным номером. Системы вир-туальной памяти ОС с сегментно-страничной организацией используют второй способ, так как он позволяет непосредственно определить принадлежность адре-са некоторому сегменту и проверить права доступа процесса к нему.
Для каждого процесса операционная система создает отдельную таб-лицу сегмен-тов, в которой содержатся описатели (дескрипторы) всех сегмен-тов процесса. Описание сегмента включает назначенные ему права доступа и другие характе-ристики, подобные тем, которые содержатся в дескрипторах сегментов при сегментной организации памяти. Однако имеется и принципи-альное отличие. В поле базового адреса указывается не начальный физиче-ский адрес сегмента, отведен-ный ему в результате загрузки в оперативную память, а начальный
линейный виртуальный адрес сегмента в пространстве виртуальных адресов (на рис. 5.20 ба-зовые физические адреса обозначены S1, S2, S3, а базовые виртуальные адреса - fl, f2, f3).
Наличие базового виртуального адреса сегмента в дескрипторе позволяет одно-значно преобразовать адрес, заданный в виде пары (номер сегмента, смещение в сегменте), в линейный виртуальный адрес байта, который затем преобразуется в физический адрес страничным механизмом.
Деление общего линейного виртуального адресного пространства про-цесса и фи-зической памяти на страницы осуществляется так же, как это делается при стра-ничной организации памяти. Размер страниц выбирается равным степени двой-ки, что упрощает механизм преобразования виртуаль-ных адресов в физические. Виртуальные страницы нумеруются в пределах виртуального адресного про-странства каждого процесса, а физические стра-ницы - в пределах оперативной памяти. При создании процесса в память за-гружается только часть
страниц, ос-тальные загружаются по мере необходи-мости. Время от времени система выгру-жает уже ненужные страницы, осво-бождая память для новых страниц. ОС ведет для каждого процесса таблицу страниц, в которой указывается соответствие вир-туальных страниц физиче-ским.
Базовые адреса таблицы сегментов и таблицы страниц процесса явля-ются ча-стью его контекста. При активизации процесса эти адреса загружают-ся в специ-альные регистры процессора и используются механизмом преобра-зования адре-сов.
Преобразование виртуального адреса в физический происходит в два этапа (рис. 5.21):
1. На первом этапе работает механизм сегментации. Исходный вирту-альный адрес, заданный в виде пары (номер сегмента, смещение), преобразу-ется в линейный виртуальный адрес. Для этого на основании базового адреса таблицы сегмен-тов и номера сегмента вычисляется адрес дескриптора сег-мента. Анализиру-ются поля дескриптора и выполняется проверка возможно-сти выполнения за-данной операции. Если доступ к сегменту разрешен, то вычисляется линей-ный виртуальный адрес путем сложения базового адреса сегмента,
извлеченного из дескриптора, и смещения, заданного в исходном виртуальном адресе.
2. На втором этапе работает страничный механизм. Полученный ли-нейный вирту-альный адрес преобразуется в искомый физический адрес. В результате пре-образования линейный виртуальный адрес представляется в том виде, в кото-ром он используется при страничной организации памяти, а именно в виде пары (номер страницы, смещение в странице). Благодаря тому что размер страницы выбран равным степени двойки, эта задача решается простым отде-лением некоторого количества младших двоичных разрядов. При этом в стар-ших
разрядах содержится номер виртуальной страницы, а в младших - смещение искомого элемента относительно начала страницы. Так, если раз-мер страницы равен 2k, то смещением является содержимое младших k разрядов, а остальные, старшие разряды содержат номер вирту-альной страницы, которой принадлежит искомый адрес. Далее преобразова-ние адреса проис-ходит так же, как при страничной организации: старшие разряды линейного виртуального адреса, содержащие номер виртуальной страницы, заменяются номером физической страницы,
взятым из таблицы страниц, а младшие раз-ряды виртуального адреса, содержащие смещение, остаются без изменения.
Как видно, механизм сегментации и страничный механизм действуют достаточ-но независимо друг от друга. Поэтому нетрудно представить себе реализацию сегментно-страничного управления памятью, в которой меха-низм сегментации работает по вышеописанной схеме, а страничный меха-низм изменен. Он реали-зует двухуровневую схему, в которой виртуальное адресное пространство делит-ся сначала на разделы, а уж потом на страницы. В таком случае преобразование виртуального адреса в физический происхо-дит в несколько этапов.
Сначала ме-ханизм сегментации обычным образом, используя таблицу сегментов, вычисляет линейный виртуальный адрес. За-тем из данного виртуального адреса вычленя-ются номер раздела, номер страницы и смещение. И далее по номеру раздела из таблицы разделов опре-деляется адрес таблицы страниц, а затем по номеру виртуальной страницы из таблицы страниц определяется номер физической страницы, к которому при-стыковывается смещение. Именно такой подход реа-лизован компанией Intel в процессорах i386, i486 и Pentium.
Рассмотрим еще одну возможную схему управления памятью, основан-ную на комбинировании сегментного и страничного механизмов. Так же как и в преды-дущих случаях, виртуальное пространство процесса делится на сегменты, а каж-дый сегмент, в свою очередь, делится на виртуальные стра-ницы. Первое отличие состоит в том, что виртуальные страницы нумеруются не в пределах всего адрес-ного пространства процесса, а в пределах сегмента. Виртуальный адрес в этом слу-чае выражается тройкой (номер сегмента, но-мер страницы,
смещение в странице).
Загрузка процесса выполняется операционной системой постранично, при этом часть страниц размещается в оперативной памяти, а часть - на дис-ке. Для каж-дого процесса создается собственная таблица сегментов, а для каждого сегмен-та - своя таблица страниц. Адрес таблицы сегментов загру-жается в специаль-ный регистр процессора, когда активизируется соответст-вующий процесс.
Таблица страниц содержит дескрипторы страниц, содержимое кото-рых полно-стью аналогично содержимому ранее описанных дескрипторов страниц. А вот таблица сегментов состоит из дескрипторов сегментов, кото-рые вместо инфор-мации о расположении сегментов в виртуальном адресном пространстве содер-жат описание расположения таблиц страниц в физической памяти. Это является вторым существенным отличием данного подхода от ранее рассмотренной схемы сегментно-страничной организации.