Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Operatsionnye_sistemy.doc
Скачиваний:
151
Добавлен:
12.03.2015
Размер:
4.94 Mб
Скачать

§ 4.3. Организация памяти в ос Windows

В Win32 API используется плоская 32-разрядная модель памяти. Каждому процес-

су выделяется “личное” (private) изолированное адресное пространство, размер которого

составляет 4Gb. Это пространство разбивается на регионы, немного отличные для

Windows9x и Windows NT. В общем для той и другой системы можно сказать, что ниж-

ние 2Gb этого пространства отведены процессу для свободного использования, а верх-

ние 2Gb зарезервированы для использования операционной системой. На рис.4.3. пред-

ставлена архитектура памяти Windows 9x, а на рис.4.4 – Windows NT.

Рис.4.3. Архитектура памяти Windows 9x.

104

Рис.4.4. Архитектура памяти Windows NT.

Как видно из данных рисунков, код системы Windows NT лучше защищен от про-

цесса пользователя, чем код Windows 9x. Это обуславливает большую устойчивость ОС

к ошибкам в прикладной программе.

Используемые прикладными программами Windows 32-разрядные адреса для дос-

тупа к коду и данным, не являются 32-разрядными физическими адресами, которые

микропроцессор использует для адресации физической памяти (В настоящее время фи-

зическая память размером 2-4 Гб не используется в ПЭВМ). Поэтому адрес, который ис-

пользуется приложением, является виртуальным адресом (virtual address).

API-функции Windows, работающие в логическом адресном пространстве объемом

до 2 Гб, поддерживаются менеджером виртуальной памяти - VMM (Virtual Memory

Manager), который, в свою очередь, оптимизирован для работы на современных 32-

разрядных процессорах. Для того чтобы аппаратное обеспечение системы могло исполь-

зовать 32-разрядную адресацию памяти, Windows обеспечивает отображение физиче-

ских адресов в виртуальном адресном пространстве и поддерживает страничную орга-

низацию памяти. На этой основе VMM формирует собственные механизмы и алгоритмы

управления виртуальной памятью.

Подобно виртуальной реальности, виртуальной оперативной памяти не существу-

ет, однако у системы возникает полная иллюзия ее наличия. 2 Гб адресного пространст-

ва, к которому может обращаться любая программа, представляют собой виртуальную

память. На самом деле в системе нет 2 Гб физической памяти, однако каким-то образом

программы могут использовать весь диапазон адресов. Очевидно, присутствует некий

фоновый "переводчик", молчаливо преобразующий каждое обращение к памяти в реаль-

ный физический адрес. Благодаря такому преобразованию реализуется большинство

возможностей менеджера виртуальной памяти (VMM). VMM - это часть операционной

системы Windows, которая отвечает за преобразование ссылок на виртуальные адреса

памяти в ссылки на реальную физическую память. Менеджер виртуальной памяти при-

нимает решения о том, где размещать каждый объект памяти и какие страницы памяти

записать на диск. Он также выделяет каждому выполняемому процессу отдельное ад-

ресное пространство, отказываясь преобразовывать виртуальные адреса одного процесса

в адреса физической памяти, используемой другим процессом. VMM поддерживает ил-

люзию "идеализированного" адресного пространства объемом 2 Гб (подобно GDI, кото-

рый создает видимость того, что каждая программа выводит графические данные в ко-

ординатном пространстве "идеализированного" логического устройства). Система

105

преобразует логические адреса памяти или логические координаты в физические и пре-

дотвращает конфликты между программами из-за попыток одновременного использова-

ния одного и того же ресурса. Рассмотрим более подробно механизм образования вирту-

альной памяти.

Физическая память делится на страницы (pages) размером 4096 байт (4 КБ). Следо-

вательно, каждая страница начинается с адреса, в котором младшие 12 бит нулевые.

Машина, оснащенная 8 МБ памяти, содержит 2048 страниц. Операционная система

Windows хранит набор таблиц страниц (каждая таблица сама представляет собой стра-

ницу) для преобразования виртуального адреса в физический.

Каждый процесс, выполняемый в Windows, имеет свою собственную страницу ка-

талога (directory page) таблиц страниц, которая содержит до 1024 32-разрядных дескрип-

тора таблиц страниц. Физический адрес страницы каталога таблиц страниц хранится в

регистре CR3 микропроцессора. Содержимое этого регистра изменяется при переключе-

нии Windows управления между процессами. Старшие 10 бит виртуального адреса оп-

ределяют один из 1024 возможных дескрипторов в каталоге таблиц страниц. В свою

очередь, старшие 20 бит дескриптора таблицы страниц определяют физический адрес

таблицы страниц (младшие 12 бит физического адреса равны нулю). Каждая таблица

страниц содержит, в свою очередь, до 1024 32-разрядных дескриптора страниц. Выбор

одного из этих дескрипторов определяется содержимым средних 10 битов исходного

виртуального адреса. Старшие 20 бит дескриптора страницы определяют физический

адрес начала страницы, а младшие 12 бит виртуального адреса определяют физическое

смещение в пределах этой страницы. На рис. 4.5. представлена схема организации вир-

туального адресного пространства.

Рис.4.5. Схема организации виртуального адресного пространства.

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

еще раз в символьной форме [6]. Вы можете представить 32-разрядный виртуальный ад-

рес (с которым оперирует программа) в виде 10-разрядного индекса в таблице каталога

таблиц страниц (d), 10-разрядного индекса в таблице страниц (р), 12-разрядного смеще-

ния (о):

dddd-dddd-ddpp-pppp-pppp-oooo-oooo-oooo

106

Для каждого процесса микропроцессор хранит в регистре CR3 (r) старшие 20 бит физи-

ческого адреса таблицы каталога таблиц страниц:

rrrr-rrrr-rrrr-rrrr-rrrr

Начальный физический адрес каталога таблиц страниц определяется как:

rrrr-rrrr-rrrr-rrrr-rrrr-0000-0000-0000

Необходимо запомнить, что каждая страница имеет размер 4 КБ и начинается с адреса, у

которого 12 младших бит нулевые. Сначала микропроцессор получает физический ад-

рес:

rrrr-rrrr-rrrr-rrrr-rrrr-dddd-dddd-dd00

По этому адресу содержится другое 20-разрядное значение (t-table):

tttt-tttt-tttt-tttt-tttt

соответствующее начальному физическому адресу таблицы страниц:

tttt-tttt-tttt-tttt-tttt-0000-0000-0000

Затем, микропроцессор осуществляет доступ по физическому адресу:

tttt-tttt-tttt-tttt-tttt-pppp-pppp-pp00

Здесь хранится 20-битная величина, являющаяся основой для физического адреса начала

страницы памяти (f-page frame):

ffff-ffff-ffff-ffff-ffff

Результирующий 32-разрядный физический адрес получается в результате комбиниро-

вания основы физического адреса страницы и 12-разрядного смещения виртуального

адреса:

ffff-ffff-ffff-ffff-ffff-oooo-oooo-oooo

Это и есть результирующий физический адрес.

Преимущества разделения памяти на страницы огромны. Во-первых, приложения

изолированы друг от друга. Никакой процесс не может случайно или преднамеренно ис-

пользовать адресное пространство другого процесса, т. к. он не имеет возможности его

адресовать без указания соответствующего значения регистра CR3 этого процесса, кото-

рое устанавливается только внутри ядра Windows.

Во-вторых, такой механизм разделения на страницы решает одну из основных про-

блем в многозадачной среде - объединение свободной памяти. При более простых схе-

мах адресации в то время, как множество программ выполняются и завершаются, память

может стать фрагментированной. В случае, если память сильно фрагментирована, про-

граммы не могут выполняться из-за недостатка непрерывной памяти, даже если общего

количества свободной памяти вполне достаточно. При использовании разделения на

страницы нет необходимости объединять свободную физическую память, поскольку

107

страницы необязательно должны быть расположены последовательно. Все управление

памятью производится с помощью манипуляций с таблицами страниц. Потери связаны

только собственно с самими таблицами страниц и с их 4 Кб размером.

В-третьих, в 32-битных дескрипторах страниц существует еще 12 бит, кроме тех,

которые используются для адреса страницы. Один из этих битов показывает возмож-

ность доступа к конкретной странице (он называется битом доступа, "accessed bit"); дру-

гой показывает, была ли произведена запись в эту страницу (он называется битом мусо-

ра, "dirty bit"). Windows может использовать эти биты для того чтобы определить, можно

ли сохранить эту страницу в файле подкачки для освобождения памяти. Еще один бит -

бит присутствия (present bit) показывает, была ли страница сброшена на диск и должна

ли быть подкачена обратно в память.

Другой бит ("чтения/записи") показывает, разрешена ли запись в данную страницу

памяти. Этот бит обеспечивает защиту кода от "блуждающих" указателей. Например,

если включить следующий оператор в программу для Windows:

*(int*) WinMain = 0 ;

то на экран будет выведено следующее окно сообщение: "This program has performed an

illegal operation and will be shutdown." ("Эта программа выполнила недопустимую опера-

цию и будет завершена"). Этот бит не препятствует компилированной и загруженной в

память программе быть запущенной на выполнение.

Приведем несколько замечаний по поводу управления памятью в Windows 9x:

Виртуальные адреса имеют разрядность 32 бита. Программа и данные имеют адреса в

диапазоне от 0х00000000 до 0x7FFFFFFF. Сама Windows использует адреса от

0х80000000 до 0xFFFFFFFF. В этой области располагаются точки входа в динамически

подключаемые библиотеки.

Общее количество свободной памяти, доступной программе, определяется как ко-

личество свободной физической памяти плюс количество свободного места на жестком

диске, доступного для свопинга страниц. Как правило, при управлении виртуальной па-

мятью Windows использует алгоритм LRU (least recently used) для определения того, ка-

кие страницы будут сброшены на диск. Бит доступа и бит мусора помогают осуществить

эту операцию. Страницы кода не должны сбрасываться на диск: поскольку запись в его

страницы запрещена, они могут быть просто загружены из файла с расширением .ЕХЕ

или из динамически подключаемой библиотеки.

Организацией свопинга занимается VMM. При генерации системы на диске обра-

зуется специальный файл свопинга, куда записываются те страницы, которым не нахо-

дится места в физической памяти. Процессы могут захватывать память в своем 32-

битном адресном пространстве и, затем, использовать ее. При обращении потока к ячей-

ке памяти могут возникнуть три различные ситуации [12]:

• Страница существует и находится в памяти

• Страница существует и выгружена на диск

• Страница не существует

При этом VMM использует алгоритм организации доступа к данным, представленный

на рис.4.6 [8].

Запуск на исполнение EXE - модуля происходит следующим образом: EXE - файл

проецируется на память. При этом он не переписывается в файл подкачки. Просто эле-

менты каталога и таблиц страниц настраиваются так, чтобы они указывали на EXE -

файл, лежащий на диске. Затем передается управление на точку входа программы. При

этом происходит возникает исключение, обрабатывая которое стандартным образом,

VMM загружает в память требуемую страницу и программа начинает исполняться. Та-

кой механизм существенно ускоряет процедуру запуска программ, так как загрузка

108

страниц EXE - модуля происходит по мере необходимости. Образно говоря, программа

сперва начинает исполняться, а потом загружается в память. Если программа записана

на дискете, то она перед началом исполнения переписывается в файл подкачки.

Рис.4.6. Алгоритм организации доступа к данным.

Для поддержания иллюзии огромного адресного пространства менеджеру вирту-

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

распределения памяти, которые процесс выполняет в выделенном ему диапазоне вирту-

альных адресов, записываются в виде дерева дескрипторов виртуальных адресов - VAD

(Virtual Address Descriptor). Каждый раз при выделении программе памяти VMM создает

дескриптор виртуального адреса (VAD) и добавляет его" к дереву (рис.4.7) [12]. VAD

содержит информацию о запрашиваемом диапазоне адресов, статусе защиты всех стра-

ниц в указанном диапазоне, а также о том, могут ли дочерние процессы наследовать

объекты, которые находятся в данном диапазоне адресов. Если поток использует адрес,

который не определен ни в одном дескрипторе, менеджер виртуальной памяти воспри-

нимает его как адрес, который никогда не резервировался, вследствие чего возникает

ошибка доступа.

Намного проще формировать VAD, чем создавать таблицу страниц и заполнять ее

адресами действительных страничных блоков. Кроме того, объем выделенной памяти не

влияет на скорость проведения операции. Резервирование 2 Кб происходит не быстрее,

чем выделение 2 Мб: по каждому запросу создается один дескриптор. Если поток ис-

109

пользует зарезервированную память, VMM закрепляет за ним страничные блоки, копи-

руя информацию из дескриптора в новую запись таблицы страниц.

0x40100000-0x40110000

чтение/запись не наследуется

0x200C0000-0x200D1000

только чтение не наследуется

0x60FD000-0x60FE1000

нет доступа не наследуется

0x100F7000-0x111D9000

чтение/запись не наследуется

0x372D5000-0x372EF000

копирование при записи

не наследуется

Рис .4.7 Дерево дескрипторов виртуальных адресов (VAD)

Диспетчер управления памятью (VMM) является составной частью ядра операци-

онной системы. Приложения не могут получить к нему прямой доступ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]