Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
17.04.2013
Размер:
158.21 Кб
Скачать

6

СПО Лекция 16 [15.07.19]

Лекция 16. Управление виртуальной памятью в Win32.

  • База данных физических страниц

  • Разделяемая память и прототип PTE

  • Отображение файлов и разделяемая память

База данных физических страниц

Memory Manager поддерживает базу данных физических страниц (PFN Database). Каждый элемент PFN Database соответствует странице физической памяти и содержит информацию о ее состоянии.

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

Состояние

Описание

Valid (or Active)

Входит в рабочее множество хоть одного процесса.

Transition

Читается из (или пишется в) страничный файл

Standby

Удалена недавно из рабочего множества (в страничном файле такая же).

Modified

Удалена недавно из рабочего множества и модифицирована(в страничном файле отличается)

Modified No-write

Удалена недавно из рабочего множества, модифицирована, но не требует записи на диск (в страничном файле отличается)

Free

Не входит в рабочее множество ни одного процесса и еще не очищена.

Zeroed

Страница свободна и очищена.

Bad

Ошибки чтения – записи

Рассмотри как происходит изменение состояния страницы (рис.2). Страница имеет состояние valid если она входит в рабочее множество процесса, при этом страница может быть «чистой» или «грязной» (биты PTE). «Грязная страница» - страница котороя была модифицирована в памяти и ее содержимое отличается от содержимого в страничном файле.

Когда Balance Set Manager удаляет страницу из рабочего множества, страница перемещается в один из трех списков: чистая страница в список standby, грязная страница в список modified, в специальных случаях (файловая система меняет FAT или MFT-Master File Table в NTFS) грязная страница помещается в список modified no-write. Последнее гарантирует, что мета данные будут записаны на диск позже, когда все операции с файлом завершены.

Страница из списка modified перемещается в список standby после того, как Memory Manager обновит ее в страничном файле. Но во время записи страницы в страничный файл ее состояние - transition (не входит ни в один из списков). Страница modified no-write перемещается в список standby, когда этого потребует файловая система. Когда число модифицированных страниц превышает некоторый порог или число свободных страниц становится меньше минимально допустимого значения (порог зависит от размера физической памяти), система активизирует процесс, который пишет модифицированные страницы в страничный файл.

Рис.1

Рис.2

Страница перемещается из списка standby в список free когда процесс освобождает виртуальную память или завершается. Если страница удалена из рабочего множества (standby, modified, modified no-write) и еще не выделена другому процессу, то при обращении процесса к этой странице она будет возвращена в рабочее множество. Эта операция называется soft-faulting.

Страница перемещается из списка standby в список zeroed после того, как специальная нить занулит ее. Эта нить выполняется с приоритетом 0 и выполняется когда нет других готовых к выполнению нитей.

При необходимости расширить рабочее множество процесса, сначала просматривается список zeroed, если список пуст, то проверяется список free, затем список standby. Если и этот список пуст, то начинается процесс выдергивания страниц из рабочих множеств процессов и выделяется освободившаяся страница.

Зануление страниц – это часть механизма защиты (страница, выделенная в распоряжение процесса не должна содержать информацию, оставшуюся от другого процесса).

Разделяемая память и прототип PTE

База данных номеров физических страниц (PFN) содержит информацию о состоянии страниц физической памяти. В простейшем случае элемент базы данных PFN содержит ссылку на соответствующий PTE. Если два или более процессов разделяют доступ к одной странице, то на нее указывают несколько PTE из таблиц страниц разных процессов. В этом случае элемент PFN указывает на структуру данных Prototype РТЕ (РРТЕ).

Процесс, который хочет предоставить часть памяти для доступа другим процессам, должен создать объект Section Object. Объект содержит информацию об имени файла его размере и отображаемой части. Другой процесс, желающий получить доступ к общей памяти должен отобразить память, описываемую объектом Section Object в свое адресное пространство.

Одновременно с созданием объекта Section Object создается другая структура - Segment. Сегмент содержит PPTE, описывающие все страницы секции. Когда страница переводится в состояние standby, modified или modified no-write, Memory Manager отмечает PTE как invalid и заносит в него ссылку на РРТЕ.

Рассмотрим следующий пример: два процесса разделяют доступ к странице. Когда страница находится в памяти, каждый из двух процессов содержит в PTE номер страницы. Если страница удалена из рабочих множеств обоих процессов, то VMM передает ее в страничный файл и изменяет PTE так что они имеют состояние invalid и указывают на РРТЕ. При возврате страницы в память Memory Manager изменяет РРТЕ (указывает на нвый номер физической страницы). Если один из процессов обращается к странице, возникает прерывание по отстутствию страницы, Memory Manager смотрит в PTE, находит номер страницы в РРТЕ и помечает PTE как valid и заменяет указатель PPTE на номер страницы. Если этого механизма нет, то при возврате страницы в память необходимо обновлять PTE во всех процессах, ссылающихся на данную страницу.

В базе данных PFN поддерживается счетчик ссылок процессов на разделяемую страницу, когда счетчик станет равным 0, то это значит, что она не входит ни в одно из рабочих множеств и перемещается в список standby или modified.

Отображение файлов и разделяемая память

Важной особенностью NT Memory Manager является возможность отображения файлов на адресное пространство процесса. Файлы, отображаемые в память, могут использоваться для организации разделяемых областей памяти.

В процессе отображения файла создаются несколько структур данных. Объект ядра файл представляет файл на жестком диске. Объект ядра Section Object (функция CreateFileMapping) содержит информацию об имени файла, его размере, отображаемой части. Сегмент содержит PPTEs секции и указывает на структуру control area, на нее же имеется ссылка из объекта файл. Структура control area создается в одном экземпляре не зависимо от количества секций.

После того как отображение выполнено, процесс может читать и писать данные файла как данные в памяти (*pMem = 23).

Когда процесс обращается к адресу, отображенному в файл, Memory Manager отыскивает VAD, который описывает диапазон адресов,затем находит control area, загружает страницу в паямять и модифицирует РТЕ. Поскольку Memory Manager знает File Object, то он может инициировать загрузку страницы из файла через файловую систему в отличие от обычной загрузки страницы из страничного файла.

Отображаемый файл может содержать программу или данные. Файл, загружаемый для выполнения, отображается как image (такая же методика используется для отображения кода DLL.). Файл с программой может отображаться и как файл данных, NT создает отдельные управляющие блоки для этих двух типов отображения.

Преимущества

  • Обмен производится страницами по 4К

  • Запись (чтение) данных файла выполняется как операции с обычной памятью

  • Имеется возможность отображать части файла в адресное пространство, что важно при работе с большими файлами

Последовательность действий при отображении файла

Открыть файл

OFSTRUCT of;

HANDLE hf = OpenFile(filename, &of, OF_READWRITE);

Создать объект - отображение

HANDLE hmf = CreateFileMapping(hf, secur_attr, PAGE_READWRITE,

size_high, size_low, object_name);

Параметры:

HANDLE отображаемого файла,

атрибуты защиты (обычно NULL),

атрибуты доступа,

64–х разрядный размер в байтах (0 – означает, что отображается весь файл),

имя объекта

Выполнить отображение

char* virt_addr = (char*)MapViewOfFile(hmf,

FILE_MAP_ALL_ACCESS,

ofs_high, ofs_low,

size);

Параметры:

HANDLE объекта – «отображение файла»,

атрибуты доступа,

64–х разрядное смещение в файле до начала отображаемого участка,

размер (0 – означает, что отображается весь файл, тогда смещение игнорируется)

Разделяемая память в страничном файле

NT использует вариацию CreateFileMapping с параметром hf = 0xffffffff для создания разделяемой секции в страничном файле. В этом случае обязательно следует указывать размеры отображаемого участка. Данные в отображаемой секции ни чем не отличаются от обычной виртуальной памяти процесса, но секция – объект ядра, который может иметь имя, и, следовательно, доступен для других процессов.

Соседние файлы в папке вар1