logo
Методичка

4.3.4 Односегментная модель памяти

В этой модели (flat segmentation model) дескрипторы всех сегментов указывают на один и тот же сегмент памяти, который соответствует всему 32-разрядному физическому адресному пространству компьютера. При этом для каждой программы операционная система создает в своих таблицах всего два дескриптора – один для сегмента кода, а другой для сегмента данных. Как уже было сказано, в защищенном режиме каждый сегмент определяется с помощью соответствующего дескриптора – 64-разрядного числа, хранящегося в специальной системной таблице, которая называется таблицей глобальных дескрипторов. На рисунке 4.3 показана односегментная модель памяти на основе глобальной таблицы дескрипторов. Смещение адреса данных в сегменте не должно превышать его размер. За этим следит менеджер памяти, являющийся частью ядра операционной системы.

Как известно, в многозадачной операционной системе допускается одновременное выполнение нескольких загруженных в память программ (или задач). При этом для каждой программы выделяется отдельная область данных. Предположим, что в каждой из трех выполняемых программ существует переменная, расположенная со смещением 200h относительно начала сегмента данных. Возникает вопрос: как разделить эти переменные друг от друга так, чтобы изменение их значений в одной из программ не влияло на другие программы? Для этой цели в процессорах семейства IA‑32 используется одно- или двухэтапный процесс преобразования смещения переменной в уникальный физический адрес памяти, в зависимости от того используется ли страничная организация памяти.

На первом этапе логический адрес, состоящий из селектора сегмента и смещения переменной, преобразуется в линейный адрес, который может являться физическим адресом переменной в памяти, если не используется страничная переадресация. Однако в современных развитых операционных системах, таких как Microsoft Windows и Linux, задействуется еще один механизм процессоров семейства IA-32, который называется страничной организацией памяти. Благодаря этому механизму размер используемого в программах линейного адресного пространства может превышать физический размер памяти компьютера. Таким образом, на втором этапе линейный адрес памяти преобразовывается в физический адрес с помощью механизма страничной переадресации.

Как процессор по значению селектора сегмента и смещению определяет линейный адрес переменной? Каждый селектор является указателем дескриптора сегмента, расположенного в одной из системных таблиц дескрипторов. Поэтому сначала по значению селектора определяется адрес дескриптора сегмента, из которого извлекается базовый адрес сегмента памяти. После этого к значению базового адреса прибавляется 32-разрядное смещение переменной, в результате чего и получается линейный адрес переменной в памяти (рис.4.3).

Линейный адрес является 32-разрядным целым числом, значение которого находится в диапазоне от 0 до FFFFFFFFh и определяет адрес объекта в памяти. Линейный адрес может соответствовать физическому адресу объекта в памяти, если механизм страничной переадресации не используется.

Если бы не было страничной адресации, то получившийся линейный адрес был бы равен физическому. При использовании страничной организации памяти происходит ещё одно преобразование, вид которого зависит от различного размера страниц – 4Kb, 2Mb, 4Mb.