Иллюстрированный самоучитель по программированию систем защиты

Архитектура памяти

Функции работы с памятью

Из всего вышеизложенного нужно выделить основные моменты:

  1. Все адресное пространство процесса (контекст памяти) делится на две области:
    • системное адресное пространство (верхние 2 Гб) и пользовательское адресное пространство (нижние 2 Гб);
    • Системное адресное пространство всегда одинаково, вне зависимости от текущего контекста памяти.
    • Пользовательское адресное пространство разное для каждого контекста памяти.
  2. Код пользовательского режима и режима ядра пользуется для доступа к памяти разными селекторами:
    • Для одного контекста памяти селекторы адресуют одну и ту же физическую память, но с разными режимами доступа.
    • Селекторы не имеют ничего общего с контекстом памяти.
    • По селекторам для ядра можно получить доступ (по крайней мере, для чтения) ко всему адресному пространству в данном контексте памяти, а по селекторам для ядра – только для пользовательской области памяти.
  3. Код в пользовательском адресном пространстве всегда вытесняемый, если не предприняты меры по созданию новой записи в каталоге страниц, указывающих на невытесняемую память.
  4. Код, работающий на уровне IRQL большем или равном DISPATCH_LEVEL, может использовать только невыгружаемую память (соответственно, сам код должен находиться в невыгружаемой памяти).
  5. В ОС существуют функции для выполнения любой работы с памятью:
    • Выделение/освобождение памяти в выгружаемой/невыгружаемой, кешируемой/некешируемой памяти.
    • Преобразование адресов памяти (виртуальный в физический, физический в виртуальный).
    • Проверка доступности памяти.

Рассмотрим эти функции более подробно.

Выделение памяти

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);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.