Windows驱动3. 内存管理
Windows驱动3. 内存管理
在驱动开发中, 通常不能使用C运行库中的内存分配函数, 如 malloc, free, new, delete.
内核模式中有自己的内存分配函数
内存管理函数
| 函数 | C库对应 | 描述 |
|---|---|---|
ExAllocatePool2 | malloc | 分配内存 |
ExFreePool | free | 释放内存 |
RtlEqualMemory | memcmp | 比较内存 |
RtlCopyMemory | memcpy | 复制内存 |
RtlFillMemory | memset | 填充内存 |
RtlZeroMemory | memset | 清零内存 |
RtlMoveMemory | memmove | 移动内存 |
块表 ExInitializePagedLookasideList
块表非常类似与ObjectPool, 用于快速分配和回收obj, 但是内存并不会被回收
c
PAGED_LOOKASIDE_LIST lookasideList;
// 初始化 PAGED_LOOKASIDE_LIST
ExInitializePagedLookasideList(&lookasideList, NULL, NULL, 0, sizeof(MyObject), 'tag', 0);
// 使用 Lookaside List
MyObject* obj = ExAllocateFromPagedLookasideList(&lookasideList);
// ... 使用 obj ...
// 完成使用后,返回 Lookaside List
ExFreeToPagedLookasideList(&lookasideList, obj);
// 删除 Lookaside List
ExDeletePagedLookasideList(&lookasideList);C++中的内存管理
在C++中, 不能使用原生的 new 和 delete , 需要对这两个操作符进行重载, 从而符合内核中的管理内存方法
cpp
void* operator new(size_t size)
{
KdPrint(("new operator\n"));
return ExAllocatePool(NonPagedPool, size);
}
void* operator new(size_t size, POOL_TYPE poolType)
{
KdPrint(("new operator\n"));
return ExAllocatePool(poolType, size);
}
void operator delete(void* p)
{
KdPrint(("delete operator\n"));
ExFreePool(p);
}Windows驱动3. 内存管理
https://simonkimi.githubio.io/2024/08/02/Windows驱动3-内存管理/