Операционная система Windows 95 для программиста

       

Адресация памяти


В операционных системах Microsoft Windows 95 и Microsoft Windows NT для 32-разрядных приложений используется сплошная, несегментированная модель памяти (FLAT-модель ). Основанная на аппаратных особенностях процессоров Intel 80386, 80486 и Pentium, эта модель позволяет адресовать память при помощи 32-разрядного смещения.

Забудьте про сегментные регистры. Их содержимое равно нулю и вам нельзя работать с сегментными регистрами в своих приложениях (даже если вы создаете драйвер устройства).

Забудьте про ключевые слова NEAR и FAR . Сплошная модель памяти похожа на модель памяти TINY , в которой программа адресуется к данным и функциям только при помощи смещения без использования сегментов. Отличие, однако, заключается в том, что размер виртуального адресного пространства в операционных системах Microsoft Windows 95 и Microsoft Windows NT достигает 4 Гбайт.

Сказанное не означает, что любое приложение имеет доступ ко всей памяти. Так как процессор работает в защищенном режиме, адресация памяти выполняется с использованием страничной адресации, глобальной таблицы дескрипторов GDT , а также локальных таблиц дескрипторов LDT . А раз так, то операционная система может ограничить права обычных приложений, "не допуская" их к системной памяти и памяти других приложений (подробное описание схемы адресации памяти в защищенном режиме вы найдете в 6 томе "Библиотеки системного программиста").

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

Теперь о том, как используется виртуальное адресное пространство в операционной системе Microsoft Windows 95 (рис. 1.1).

Рис. 1.1. Распределение виртуального адресного пространства в операционной системе Microsoft Windows 95

Верхний гигабайт адресного пространства зарезервирован для использования операционной системой (неплохой запас, не правда ли?). В этой области располагаются виртуальные драйверы, работающие в нулевом кольце защиты, планировщик виртуальных машин, расширитель DOS (DOS extender ), а также сервер DPMI.


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

Третий гигабайт виртуального адресного пространства (область совместного использования) нужна для создания блоков памяти, доступных одновременно из нескольких приложений. Из этой области выделяется память для 16-разрядных приложений Windows, а также память, полученная от сервера DPMI.

32-разрядные приложения также работают с этой областью. В частности, здесь находятся некоторые системные 32-разрядные DLL-библиотеки (KERNEL32.DLL , USER32.DLL , GDI32.DLL ), из этой области выделяется память для работы с отображаемыми файлами (об отображаемых файлах мы расскажем в разделе "Изменения в файловой системе"). Кроме того, область совместного использования нужна виртуальным драйверам для создания глобальных блоков памяти, доступных в любой момент времени.

Область, которая простирается от границы первых 4 Мбайт до границы 2 Гбайт содержит адресное пространство текущего 32-разрядного процесса (который в данный момент активен). Здесь размещается исполнимый код процесса, его данные и полученные динамически блоки памяти. Защита адресных пространств разных процессов достигается при помощи механизма страничной адресации.

И, наконец, первые четыре мегабайта виртуального адресного пространства зарезервированы для системы. К этой области имеют доступ 16-разрядные приложения Windows и программы DOS, причем текущая виртуальная машина располагается в пределах первого мегабайта. Остальные три мегабайта нужны для загрузки резидентных программ и драйверов DOS (теперь вряд ли вы теперь сможете пожаловаться на то, что для резидентных программ и драйверов выделяется слишком мало памяти). Заметим также, что первые четыре мегабайта виртуального адресного пространства недоступны для 32-разрядных приложений.


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