Существуют две другие схемы организации управления памятью:
сегментная и сегментно-страничная. Сегменты, в отличие от страниц,
могут иметь переменный размер. Идея сегментации изложена во
введении. При сегментной организации виртуальный адрес является
двумерным как для программиста, так и для операционной системы, и
состоит из двух полей – номера сегмента и смещения внутри сегмента.
Подчеркнем, что в отличие от страничной организации, где линейный
адрес преобразован в двумерный операционной системой для удобства
отображения, здесь двумерность адреса является следствием
представления пользователя о процессе не в виде линейного массива
байтов, а как набор сегментов переменного размера (данные, код,
стек...).
Программисты, пишущие на языках низкого уровня, должны иметь
представление о сегментной организации, явным образом меняя
значения сегментных регистров (это хорошо видно по текстам
программ, написанных на Ассемблере). Логическое адресное
пространство – набор сегментов. Каждый сегмент имеет имя, размер и
другие параметры (уровень привилегий, разрешенные виды обращений,
флаги присутствия). В отличие от страничной схемы, где пользователь
задает только один адрес, который разбивается на номер страницы и
смещение прозрачным для программиста образом, в сегментной схеме
пользователь специфицирует каждый адрес двумя величинами: именем
сегмента и смещением.
Каждый сегмент – линейная последовательность адресов, начинающаяся
с 0. Максимальный размер сегмента определяется разрядностью
процессора (при 32-разрядной адресации это 232 байт или 4 Гбайт).
Размер сегмента может меняться динамически (например, сегмент
стека). В элементе таблицы сегментов помимо физического адреса
начала сегмента обычно содержится и длина сегмента. Если размер
смещения в виртуальном адресе выходит за пределы размера сегмента,
возникает исключительная ситуация.
Логический адрес – упорядоченная пара v=(s,d), номер сегмента и
смещение внутри сегмента.
В системах, где сегменты поддерживаются аппаратно, эти параметры
обычно хранятся в таблице дескрипторов сегментов, а программа
обращается к этим дескрипторам по номерам-селекторам. При этом в
контекст каждого процесса входит набор сегментных регистров,
содержащих селекторы текущих сегментов кода, стека, данных и т. д.
и определяющих, какие сегменты будут использоваться при разных
видах обращений к памяти. Это позволяет процессору уже на
аппаратном уровне определять допустимость обращений к памяти,
упрощая реализацию защиты информации от повреждения и
несанкционированного доступа.
Рис. 8.8. Преобразование логического адреса при сегментной
организации памяти
Аппаратная поддержка сегментов распространена мало (главным образом
на процессорах Intel). В большинстве ОС сегментация реализуется на
уровне, не зависящем от аппаратуры.
Хранить в памяти сегменты большого размера целиком так же неудобно,
как и хранить процесс непрерывным блоком. Напрашивается идея
разбиения сегментов на страницы. При сегментно-страничной
организации памяти происходит двухуровневая трансляция виртуального
адреса в физический. В этом случае логический адрес состоит из трех
полей: номера сегмента логической памяти, номера страницы внутри
сегмента и смещения внутри страницы. Соответственно, используются
две таблицы отображения – таблица сегментов, связывающая номер
сегмента с таблицей страниц, и отдельная таблица страниц для
каждого сегмента.
Рис. 8.9. Упрощенная схема формирования физического адреса при
сегментно-страничной организации памяти
Сегментно-страничная и страничная организация памяти позволяет
легко организовать совместное использование одних и тех же данных и
программного кода разными задачами. Для этого различные логические
блоки памяти разных процессов отображают в один и тот же блок
физической памяти, где размещается разделяемый фрагмент кода или
данных.
Сегментная и сегментно-страничная организация памяти
96
0
2 минуты
Темы:
Понравилась работу? Лайкни ее и оставь свой комментарий!
Для автора это очень важно, это стимулирует его на новое творчество!