- •Лекция №4. Архитектура памяти. Управление памятью. Mdl. Выделение памяти. Отображение памяти. [4.1] Организация памяти в защищенном режиме работы процессора
- •[4.2] Организация системного адресного пространства
- •[4.4] Совместное использование памяти
- •[4.5] Объект Секция
- •[4.6] Таблица описания памяти (Memory Descriptor List - mdl)
- •[4.7] Подведение итогов. Функции работы с памятью
- •[4.7.1]Выделениепамяти
- •[4.7.2] Lookaside List
- •[4.7.3] Отображение памяти устройств и пространства в/в
- •[4.7.4]УправлениепамятьюиMdl
[4.7.1]Выделениепамяти
PVOID ExAllocatePool(
IN POOL_TYPE PoolType,
IN ULONG NumberOfBytes);
PVOID ExAllocatePoolWithTag(
IN POOL_TYPE PoolType,
IN ULONG NumberOfBytes, IN ULONG Tag);
Table12.1: ExAllocatePool POOL_TYPEs
|
Тип памяти (PoolType)
|
Описание
|
|
Nonpaged Pool Allocations
| |
|
NonPagedPool
|
Обычное выделение памяти из Nonpaged Pool.
|
|
NonPagedPoolCacheAligned
|
Allocation will be aligned to a cache line.
|
|
Must-Succeed Allocations
| |
|
NonPagedPoolMustSucceed
|
Используется в специальных случаях драйверами, необходимыми для загрузки системы. |
|
NonPagedPoolCacheAlignedMustSucceed
| |
|
Paged Pool Allocations
| |
|
PagedPool
|
Обычное выделение памяти из Paged Pool.
|
|
PagedPoolCacheAligned
|
Allocation will be aligned to a cache line.
|
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);
[4.7.2] Lookaside List
Во многих случаях, выделение и освобождение временного буфера памяти должно происходить очень часто. Для уменьшения накладных расходов служит Lookaside List – список заранее выделенных блоков памяти фиксированного размера.
Первоначально, память выделяется только под небольшой заголовок со служебной информацией. При каждом запросе на выделение памяти проверяется, есть ли в списке свободные блоки. Если их нет – они выделяются из выгружаемой или невыгружаемой памяти. Если они есть, то они помечаются как используемые и выдаются для использования.
VOID ExInitializeNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST Lookaside,
IN PALLOCATE_FUNCTION Allocate OPTIONAL,
IN PFREE_FUNCTION Free OPTIONAL,
IN ULONG Flags,
IN ULONG Size,
IN ULONG Tag,
IN USHORT Depth );
VOID ExInitializePagedLookasideList(
IN PPAGED_LOOKASIDE_LIST Lookaside,
IN PALLOCATE_FUNCTION Allocate OPTIONAL,
IN PFREE_FUNCTION Free OPTIONAL,
IN ULONG Flags,
IN ULONG Size,
IN ULONG Tag,
IN USHORT Depth );
PVOID ExAllocateFromNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside);
PVOID ExAllocateFromPagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside);
VOID ExFreeToNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry);
VOID ExFreeToPagedLookasideList(
IN PPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry);
VOID ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside);
VOID ExDeletePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside);
[4.7.3] Отображение памяти устройств и пространства в/в
См. раздел ”Типы адресов в NT”.
BOOLEAN HalTranslateBusAddress( IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
PVOID MmMapIoSpace( IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberOfBytes,
IN BOOLEAN CacheEnable);
VOID MmUnmapIoSpace( IN PVOID BaseAddress,
IN ULONG NumberOfBytes);
