Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы_ОСиСП.docx
Скачиваний:
55
Добавлен:
20.04.2019
Размер:
623.57 Кб
Скачать

35. Блокирование страниц в памяти. Списки описателей памяти (mdl) и их использование

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

- Windows-приложения могут блокировать страницы в рабочем наборе своего процесса через функцию VirtualLock. Максимальное число страниц, которые процесс может блокировать, равно минимальному размеру его рабочего набора за вычетом восьми страниц. Следовательно, если процессу нужно блокировать большее число страниц, он может увеличить минимальный размер своего рабочего набора вызовом функции SetProcessWorkingSetSize

- Драйверы устройств могут вызывать функции режима ядра MmProbeAnd LockPages, MmLockPagableCodeSection и MmLockPagableSectionByHandle.

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

Таблица описания памяти (Memory Descriptor List, MDL)

Диспетчер памяти использует структуру MDL для описания набора страниц физической памяти, составляющих буфер виртуальной памяти в контексте памяти некоторого процесса. Интерпретация MDL не зависит от контекста памяти, поскольку MDL оперирует со страницами физической памяти. Получив для данного буфера описание в виде MDL, драйвер в дальнейшем может использовать буфер в контексте памяти любого процесса. Для того, чтобы обращаться к такой памяти, необходимо получить для MDL адрес памяти в системном адресном пространстве. Сделать это можно с помощью функции MmGetSystemAddressForMdl().

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

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

Когда программа пользовательского режима выполняет обращение к ОС (например I/O) и передает какой-то буфер с данными, ОС строит MDL, описывающий буфер, и передает MDL драйверу, выполняющему I/O. Драйвер работает с физическими адресами, хранящимися в MDL.

36. Представление объекта ядра в памяти. Менеджер объектов.

Каждый объект ядра — на самом деле просто блок памяти, выделенный ядром и доступный только ему. Этот блок представляет собой структуру данных, в элементах которой содержится информация об объекте. Объекты хранятся в нестраничных пулах (не выгружаются на диск). Объекты определенных типов хранятся вместе. Объекты ядра имеют теги (например файл имеет тег «File»).

HANDLE_TABLE – таблица дескрипторов объектов ядра, расположена в страничном пуле. Каждый элемент этой таблицы – HANDLE_TABLE_ENTRY.

Структура Memory Descriptor List

Диспетчер памяти использует структуру MDL для описания набора страниц физической памяти, составляющих буфер виртуальной памяти в контексте памяти некоторого процесса. Интерпретация MDL не зависит от контекста памяти, поскольку MDL оперирует со страницами физической памяти. Получив для данного буфера описание в виде MDL, драйвер в дальнейшем может использовать буфер в контексте памяти любого процесса. Для того, чтобы обращаться к такой памяти, необходимо получить для MDL адрес памяти в системном адресном пространстве. Сделать это можно с помощью функции MmGetSystemAddressForMdl().

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

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