Операционная система OS2 Warp

       

Управление памятью в первых версиях IBM OS/2 и в стандартном режиме Microsoft Windows


С появлением процессора i80286, способного работать не только в реальном, но и в защищенном режиме, появилась возможность создания более совершенной системы управления памятью.

Самое главное достижение защищенного режима работы процессора заключается в том, что программы не оперировали непосредственно с физическими адресами памяти, а использовали для адресации так называемые таблицы глобальных и локальных дескрипторов. Эти таблицы готовились операционной системой и программы не могли их изменить самостоятельно. Кроме того, был предусмотрен механизм защиты, с помощью которого операционная система может предотвратить доступ обычных программ к системной памяти и памяти других программ, а также аппаратная реализация мультизадачности (переключение задач).

Появилось понятие "логический адрес ". Когда программа адресуется к памяти в защищенном режиме, она не указывает сегмент и смещение, вместо этого она пользуется логическим адресом.

Логический адрес состоит из двух компонент - селектора и смещения.

Селектор служит индексом в таблицах дескрипторов, содержащих помимо другой информации 24-разрядные базовые адреса сегментов. Дескриптор описывает сегмент памяти и содержит не только базовый адрес, но и другие характеристики, такие, например, как размер сегмента и поле доступа. Для получения 24-разрядного физического адреса базовый адрес складывается с 16-разрядным смещением (рис. 1.9).

Рис. 1.9. Адресация памяти в защищенном режиме для процессора i80286 (упрощенная схема)

Эта схема адресации памяти была использована в первых версиях операционной системы IBM OS/2 и в стандартном режиме работы Microsoft Windows.

Мы уже говорили, что помимо базового адреса таблица дескрипторов содержит и другую информацию.

Создавая дескриптор, операционная система описывает в нем размер памяти. Если программа, адресуя блок памяти с помощью данного дескриптора, попытается выполнить чтение или запись за пределами сегмента, произойдет прерывание и работа программы будет остановлена.
Таким образом, надежность операционной системы в защищенном режиме значительно повышается.

Далее, для каждого сегмента памяти, описанного в таблице дескрипторов, хранится его тип. Выделяются сегменты кода, сегменты данных и системные сегменты. Программа не может ничего записать в сегмент кода, ей можно даже запретить читать сегменты кода. Сегмент кода содержит программный код и потому может только выполняться. Сегменты данных, напротив, предназначены исключительно для хранения данных. Что же касается системных сегментов, то обычная программа не имеет к ним никакого доступа.

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



Рис. 1.10. Кольца защиты

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

Сложная система защиты, встроенная в процессор i80286, предохраняет операционную систему от "произвола" программ пользователя. В то же время она оставляет последним возможность вызова модулей операционной системы для выполнения необходимого сервиса, такого как получение блока памяти или работа с файлами. Не имея возможности рассказать вам в этой книге подробнее о системе защиты процессора i80286, мы скажем только, что она хорошо продумана и очень надежна, так как основывается на аппаратных средствах процессора. Подробности вы можете узнать из 6 тома "Библиотеки системного программиста".

Описанная выше схема адресации памяти значительно лучше той, что использовалась в DOS, однако и она не лишена недостатков.



Несмотря на то что общий объем непосредственно адресуемой памяти возрос до 16 Мбайт, максимальный размер сегмента остался равным 64 Кбайт. Поэтому программисты по-прежнему вынуждены использовать различные модели памяти и модификаторы near и far .



В системе может быть одна глобальная таблица дескрипторов и много локальных таблиц дескрипторов. В каждый момент времени программа может адресоваться к глобальной таблице дескрипторов и к одной из локальных таблиц дескрипторов (к какой именно - решает операционная система).

Глобальная таблица дескрипторов описывает сегменты памяти, принадлежащие операционной системе. Некоторые из содержащихся в ней дескрипторов имеют уровень привилегий, равный 3, поэтому к ним можно обращаться даже из обычных программ.

Для каждого процесса в IBM OS/2 создается своя локальная таблица дескрипторов . Именно поэтому адресные пространства процессов разделены физически. Таким образом, каждый процесс может адресоваться к "разрешенным" сегментам системной памяти и к своим собственным сегментам, но никак не к сегментам других процессов.

Что же касается Microsoft Windows, то здесь используется одна локальная таблица дескрипторов для всех приложений. Кроме того, все приложения работают в одном, третьем, кольце защиты. Поэтому любое приложение может обратиться к сегментам памяти, созданным другими приложениями. Это снижает устойчивость системы к приложениям, содержащим ошибки.


Содержание раздела