Ring0 - Lookaside结构
Posted 生如逆旅 一苇以航
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ring0 - Lookaside结构相关的知识,希望对你有一定的参考价值。
由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用Lookaside.
1.每次申请固定大小的内存.
2.申请和回收的操作十分频繁.
实现原理:
他先向windows申请了一块比较大的内存.而后以后申请内存都从Lookaside对象申请.这样就会避免内存"空洞",Lookaside对象内部的内存不够用时,他会向操作系统申请更多内存.当Lookaside内部有大量的未使用的内存时,他会自动让windows回收一部分内存.总之Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。
初始化Lookaside
//分页
VOID
ExInitializePagedLookasideList (
_Out_ PPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size,
_In_ ULONG Tag, //随便写
_In_ USHORT Depth //保留.必须是零.
);
//不分页
VOID
ExInitializeNPagedLookasideList (
_Out_ PNPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size, //每个非分页条目的大小,即字节的大小
_In_ ULONG Tag,
_In_ USHORT Depth //保留.必须是零
);
1 #include <ntifs.h> 2 3 4 5 6 typedef struct _ITEM_ 7 { 8 ULONG ItemData; 9 }ITEM, *PITEM; 10 11 12 void LookasideTest(); 13 14 15 VOID DriverUnload(PDRIVER_OBJECT DriverObject); 16 17 18 19 20 21 22 23 24 25 26 27 #include "Lookaside.h" 28 29 //bp Lookaside!DriverEntry 30 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath) 31 { 32 NTSTATUS Status = STATUS_SUCCESS; 33 PDEVICE_OBJECT DeviceObject = NULL; 34 35 DriverObject->DriverUnload = DriverUnload; 36 37 38 LookasideTest(); 39 40 41 42 return Status; 43 } 44 45 46 void LookasideTest() 47 { 48 //初始化Lookaside对象 49 int i = 0; 50 PAGED_LOOKASIDE_LIST PagedLookasideList; 51 52 ExInitializePagedLookasideList( 53 &PagedLookasideList, 54 NULL, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目 55 NULL, 56 0, 57 sizeof(ITEM), 58 ‘8888‘,//ulong 4位数字 59 0//保留.必须是零. 60 );//分页 61 62 #define ARRAY_NUMBER 50 63 PITEM Item[ARRAY_NUMBER]; 64 //模拟频繁申请内存 65 for (i = 0; i < ARRAY_NUMBER; i++) 66 { 67 Item[i] = (PITEM)ExAllocateFromPagedLookasideList( 68 &PagedLookasideList); 69 } 70 71 for (i = 0; i < ARRAY_NUMBER; i++) 72 { 73 Item[i]->ItemData = i; 74 } 75 76 for (i = 0; i < ARRAY_NUMBER; i++) 77 { 78 DbgPrint("%d\r\n", Item[i]->ItemData); 79 } 80 //模拟频繁回收内存 81 for (i = 0; i < ARRAY_NUMBER; i++) 82 { 83 ExFreeToPagedLookasideList( 84 &PagedLookasideList, 85 Item[i] 86 ); 87 88 Item[i] = NULL; 89 } 90 91 ExDeletePagedLookasideList(&PagedLookasideList); 92 //删除LookasidePagedLookasideList 93 94 95 96 97 } 98 99 VOID DriverUnload(PDRIVER_OBJECT DriverObject) 100 { 101 DbgPrint("DriverUnload()\r\n"); 102 }
以上是关于Ring0 - Lookaside结构的主要内容,如果未能解决你的问题,请参考以下文章