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

4. Работа с деревом виртуальных адресных дескрипторов процесса (vad): получение снимка адресного пространства на уровнеVad

По смещению 0x194 байта (ОСWin2000 и выше) либо 0х170 (ОСNT4), либо 0x11C(WinXP) от начала структурыpebнаходится корневой элемент дереваVAD:

//получаем образ процесса. peb+0x194 - указатель на pVadRoot

pVadRoot = *(PUINT32)((PUCHAR)peb + 0x194);

Структура элемента VAD:

typedef struct vad {

void *StartingAddress;

void *EndingAddress;

struct vad *ParentLink;

struct vad *LeftLink;

struct vad *RightLink;

ULONG Flags;

}VAD, *PVAD;

Начиная с ОС Win2000 значенияStartingAddressиEndingAddressявляются номерами страниц размером 4 Кб, тогда как в ОСNT4 это были обычные виртуальные адреса. Соответственно, для получения виртуального адреса в ОСWin2000 и выше необходимо значение адреса умножить на 4096 (сдвиг влево на 12).

5. Работа с каталогом страниц (см. Также п.11.3 в документации “PentiumProcessor.Pdf”):

Все, описанное в этом разделе, относится только к 32-разрядной адресации без расширенного режима адресации (PAE). Для реализации работы с адресными пространствами во всех режимах адресации – см. документациюIntel, а также книгу Шрайбера и исходники к ней.

Каталог страниц - PageDirectory

Таблица страниц - PageTable

В соответствии с документацией по процессорам Intel:

А) Физический адрес каталога страниц содержится в регистре CR3.

Б) Каждый элемент каталога страниц, также как и каждый элемент таблицы страниц, для присутствующей страницы (установлен бит присутствия) содержит физический адрес страницы. При этом 4-Кбайтная страница, определенная элементом каталога страниц, в свою очередь содержит таблицу страниц. Если бит присутствия не установлен, физической страницы нет.

В) Каталог страниц – единственный, состоит из 210(1024) записей размером 4 байта каждая. Каждая запись описывает страницу памяти либо размером 4Кб, либо размером 4Мб. Это определяется специальным битом записи (бит размера страницы). Если размер страницы=4Кб, эта страница содержит таблицу страниц. Если размер страницы 4Мб, это обычная страница памяти, таблица страниц не используется.

Г) Таблиц страниц может быть много (но не более 210), местоположение каждой описывается одним из элементов каталога страниц (но только если он описывает страницу 4Кб). Каждая таблица страниц состоит из 210(1024) записей размером 4 байта каждая. Каждая запись описывает страницу памяти размером 4Кб (таблица страниц не может описывать 4Мб - страницы).

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

Виртуальный адрес первой таблицы страниц всегда равен 0xc0000000.

Виртуальный адрес каталога страниц всегда равен 0xc0300000.

Таким образом, зная линейный адрес (LinearAddress), можно получить виртуальный адрес описывающей его таблицы страниц по формуле ((LinearAddress>>12)*4)+0xc0000000

Напоминание: при страничном преобразования линейного адреса в физический, линейный адрес разбивается на 3 диапазона:

  • 10 старших бит (с 31 по 22) – индекс в каталоге страниц, элемент каталога определяет таблицу страниц;

  • 10 бит (с 21 по 12) – индекс в выбранной таблице страниц, элемент которой определяет физическую страницу;

  • 12 младших бит (с 11 по 0) – смещение на странице до нужного байта.

Размер каждого элемента каталога и таблицы страниц = 4 байта. В силу упомянутой выше линейности в расположении таблиц страниц получаем вышеприведенную формулу, в которой 20 старших бит линейного адреса определяют расположение требуемой таблицы страниц в памяти.

ВНИМАНИЕ: пользуясь только этой формулой для вычисления адреса таблицы страниц, при проходе по всем линейным адресам в итоге получим синий экран. Причина: не все таблицы страниц реально существуют. Для проверки того, существует ли таблица страниц, нужно воспользоваться 10 старшими битами для получения элемента каталога страниц. Этот элемент может указывать на отсутствие страницы.

Кроме того, некоторые элементы каталога страниц могут описывать страницы размером 4Мб, в этом случае для всего соответствующего диапазона виртуальных адресов (у которых старшие 10 бит линейного адреса указывают на такой элемент каталога страниц) таблицы страниц не используются.

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