Архитектура памяти
Функции работы с памятью
Из всего вышеизложенного нужно выделить основные моменты:
- Все адресное пространство процесса (контекст памяти) делится на две области:
- системное адресное пространство (верхние 2 Гб) и пользовательское адресное пространство (нижние 2 Гб);
- Системное адресное пространство всегда одинаково, вне зависимости от текущего контекста памяти.
- Пользовательское адресное пространство разное для каждого контекста памяти.
- Код пользовательского режима и режима ядра пользуется для доступа к памяти разными селекторами:
- Для одного контекста памяти селекторы адресуют одну и ту же физическую память, но с разными режимами доступа.
- Селекторы не имеют ничего общего с контекстом памяти.
- По селекторам для ядра можно получить доступ (по крайней мере, для чтения) ко всему адресному пространству в данном контексте памяти, а по селекторам для ядра – только для пользовательской области памяти.
- Код в пользовательском адресном пространстве всегда вытесняемый, если не предприняты меры по созданию новой записи в каталоге страниц, указывающих на невытесняемую память.
- Код, работающий на уровне IRQL большем или равном DISPATCH_LEVEL, может использовать только невыгружаемую память (соответственно, сам код должен находиться в невыгружаемой памяти).
- В ОС существуют функции для выполнения любой работы с памятью:
- Выделение/освобождение памяти в выгружаемой/невыгружаемой, кешируемой/некешируемой памяти.
- Преобразование адресов памяти (виртуальный в физический, физический в виртуальный).
- Проверка доступности памяти.
Рассмотрим эти функции более подробно.
Выделение памяти
PVOID ExAllocatePool( IN POOLJTYPE PoolType, IN ULONG NumberOfBytes); PVOID ExAllocatePoolWithTag( IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag);
Где: POOLJTYPE принимает следующие значения:
Тип памяти (PoolType) | Описание |
---|---|
NonPagedPool | Обычное выделение памяти из Nonpaged Pool. |
NonPagedPoolCacheAligned | Выделение памяти из Nonpaged Pool будет выровнено по линии кеша. |
NonPagedPooMustSucceed | Используются в специальных случаях драйверами, необходимыми для загрузки системы. |
NonPagedPoolCacheAlignedMustSucceed | |
PagedPool | Обычное выделение памяти из Paged Pool. |
PagedPoolCacheAligned | Выделение памяти из Paged Pool будет выровнено по линии кеша. |
VOID ExFreePool(IN PVOID address); PVOID MmAllocateNonCachedMemory(IN ULONG NumberOfBytes); VOID MmFreeNonCachedMemory(IN PVOID BaseAddress, IN ULONG NumberOfBytes); PVOID MmAllocateContiguousMemory(IN ULONG NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress); VOID MmFreeContiguousMemory(IN PVOID BaseAddress);