Предыдущий раздел РАБОТА С ОПЕРАТИВНОЙ ПАМЯТЬЮ В ЗАЩИЩЕННОМ РЕЖИМЕ Следующий раздел

23.2.2. Распределение памяти

В отличие от процессора i8086, наличие аппаратуры управления сегментами в процессорах, начиная с i80386, обусловлено, не стремлением расширить объем адресуемой памяти, а вызвано следующими причинами. Во-первых, благодаря дескрипторам сегментов решается задача аппаратной защиты информации в ОП. При этом возводится достаточно надежный «забор» между сегментами памяти разных процессов. Методы реализации такой защиты будут рассмотрены в п.6.2.3.

Во-вторых, сегментная организация памяти существенно упрощает использование одной и той же области памяти несколькими процессами. В качестве таких областей могут рассматриваться реентерабельные программы, DLL, а также разделяемые области данных. Например, неизменяемый код реентерабельной программы выделяется в каждом из процессов в отдельный сегмент кода. (На аппаратном уровне для сегмента кода обеспечивается запрет какой-либо записи.) При создании первого процесса, использующего данную реентерабельную программу, производится загрузка этой программы в память (ОП + область свопинга), а в LDT процесса помещается дескриптор сегмента кода, содержащий виртуальный линейный адрес загруженной программы. При создании всех последующих процессов в ихLDT также помещаются дескрипторы сегментов кода, содержащие виртуальные линейные адреса реентерабельного сегмента. При отсутствии аппаратуры управления страницами эти линейные адреса будут совпадать, а при наличии такой аппаратуры виртуальные линейные адреса реентерабельного сегмента кода будут, скорее всего, разными. Так как сегменты данных у каждого из процессов свои, то никакого влияния процессов друг на друга нет.

Реентерабельный код DLL также записывается в отдельный сегмент кода, который может использовать любой процесс. Для этого требуется поместить дескриптор сегмента в LDT процесса. Очевидно, что каждый процесс должен иметь свой экземпляр сегмента данных DLL, а его дескриптор – в своей LDT. Использование для информационного взаимодействия между процессами разделяемого сегмента данных предполагает размещение в LDT каждого процесса своего дескриптора этого сегмента. Подобное размещение выполняет ядро при выполнении системного вызова СОЗДАТЬ_РАЗДЕЛЯЕМЫЙ_СЕГМЕНТ.

Перечисленные достоинства сегментной организации памяти уменьшают потребности процессов в ОП, но не устраняют такую потребность совсем. Рассмотрим распределение ОП при наличии аппаратуры управления сегментами и отсутствии аппаратуры управления страницами. Решение этой задачи возможно двумя способами.

Простейший подход предполагает, что суммарный объем сегментной виртуальной памяти всех процессов не может превышать объем ОП. В этом случае, для выделения памяти новому процессу ОС рассматривает свободные участки памяти, оставшиеся после первоначальной загрузки в ОП ядра ОС, а также программ предыдущих процессов. Например, допустим, что перед созданием процесса 4 ОП имеет состояние, изображенное на рис.39.

Если общая длина программы 4 превышает 4,5 Мбайт, то в данный момент требуемая память выделена быть не может и создание процесса откладывается до ее появления. Если длина программы не превышает суммарного объема свободной ОП, то возможны два варианта. Во-первых, программа может быть легко загружена в память, если для каждого сегмента программы имеется не меньший свободный участок ОП. Если это не так, то ОС должна «сдвинуть» в памяти ранее загруженные программы процессов. Например, пусть программа 4 имеет 2 сегмента длиной по 2 Мбайта. Тогда без перемещения программы 2 в сторону больших или меньших адресов, программа 4 загружена быть не может.

 

 

Рис. 78. Пример распределения памяти

 

Изложенная простейшая схема распределения ОП исходит из предположения, что суммарный объем виртуальной памяти процессов не превышает суммарного объема реальной ОП. (При этом разделяемые сегменты кода или данных учитываются лишь один раз.) Но аппаратура управления сегментами в i80386 позволяет отойти от этого предположения и загружать в память меньшего объема большую по размеру программу. Иными словами, виртуальная сегментная память процесса может быть больше, чем выделенная процессу реальная ОП.         

Реализация подобного подхода основана на наличии в дескрипторе каждого сегмента битов P (бит присутствия) и A (бит обращения к сегменту). А также на наличии у процессора исключения отказ сегмента. Совместная работа аппаратуры и ядра ОС заключается в следующем.

Когда на ЦП попадает адрес ячейки в виде ((T, I), L), то аппаратно проверяется бит P в искомом дескрипторе. Если P=1 (сегмент в ОП), то выполнение программы продолжается, иначе возникает исключение отказ сегмента. Его обработчик подкачивает требуемый сегмент из ВП. Так как для размещения этого сегмента может потребоваться откачка другого сегмента, то для определения откачиваемого сегмента может помочь бит A. Если он сброшен, то к сегменту не было обращения, и он может быть откачен.

Перекачка сегментов между ОП и ВП называется сегментным свопингом. Распределение ОП, основанное на свопинге, обладает тем существенным недостатком, что вследствие неодинаковой длины сегментов размещение одного сегмента может потребовать откачку и (или) перемещение в ОП не одного, а нескольких других сегментов.

 


Предыдущий раздел В начало Следующий раздел