快查表Lookaside结构

在内核中,频繁的申请和释放内存。容易造成大量的内存碎片。
ddk提供了一种解决方式,使用Lookaside对象。该对象会一次性申请一个大的内存,以后每次需要内存的时候就到这个对象中去拿
Lookaside对象内部的内存不够用时,它会向操作系统申请更多的内存。当Lookaside对象
内部有大量的未使用的内存时,它会自动让Windows回收一部分内存。 总之,Lookaside
是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向Windows
申请内存。Lookaside 一-般会在以下情况使用:
(1)程序员每次申请固定大小的内存。
(2)申请和回收的操作十分频繁。
如果程序员遇到上述两种情况,可以考虑使用Lookaside 对象。驱动程序中的运行效
率是程序员必须考虑的问题。如果驱动程序的运行效率低,会严重影响到操作系统的性能。
使用Lookaside对象,首先要初始化Lookaside对象,有以下两个函数可以使用:

非分页内存

void ExInitializeNPagedLookasideList(
  PNPAGED_LOOKASIDE_LIST Lookaside,
  PALLOCATE_FUNCTION     Allocate,
  PFREE_FUNCTION         Free,
  ULONG                  Flags,
  SIZE_T                 Size,
  ULONG                  Tag,
  USHORT                 Depth
);

分页内存

void ExInitializePagedLookasideList(
  PPAGED_LOOKASIDE_LIST Lookaside,
  PALLOCATE_FUNCTION    Allocate,
  PFREE_FUNCTION        Free,
  ULONG                 Flags,
  SIZE_T                Size,
  ULONG                 Tag,
  USHORT                Depth
);

初始化Lookaside结构后,就可以申请内存了。
同样也有两个申请内存的函数
非分页内存申请方式

PVOID ExAllocateFromNPagedLookasideList(
  PNPAGED_LOOKASIDE_LIST Lookaside
);

分页内存申请方式

PVOID ExAllocateFromPagedLookasideList(
  PPAGED_LOOKASIDE_LIST Lookaside
);


对Lookaside对象回收内存的操作(也就是ExAllocateFromNPagedLookasideList申请分配的非分页内存或者ExAllocateFromPagedLookasideList申请的分页内存),有以下两个函数:

void ExFreeToNPagedLookasideList(
  PNPAGED_LOOKASIDE_LIST Lookaside,
  PVOID                  Entry
);

void ExFreeToPagedLookasideList(
  PPAGED_LOOKASIDE_LIST Lookaside,
  PVOID                 Entry
);

删除Lookaside对象

void ExDeleteNPagedLookasideList(
  PNPAGED_LOOKASIDE_LIST Lookaside
);
void ExDeletePagedLookasideList(
  PPAGED_LOOKASIDE_LIST Lookaside
);

模拟多次内存申请和释放

#include<ntddk.h>

typedef struct _MYDATASTRUCT
{
	//下面是自定义的数据
	ULONG x;
	ULONG y;
	// List Entry需要作为MYDATASTRUCT结构体的一部分
	LIST_ENTRY ListEntry;


}MYDATASTRUCT, *PMYDATASTRUCT;

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
	DbgPrint("unload");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pReg)
{
	PMYDATASTRUCT MyObjectArr[500];
	//申明一个PAGED_LOOKASIDE_LIST对象,用于接收初始化后的数据
	PAGED_LOOKASIDE_LIST pageList;
	
	//初始化PAGED_LOOKASIDE_LIST结构
	ExInitializePagedLookasideList(&pageList,0,0,0,sizeof(MYDATASTRUCT),'1234',0);
	
	for (ULONG i = 0; i < 500;i++)
	{
		//在已经分配好的Lookasdide对象中申请内存。
		MyObjectArr[i] = (PMYDATASTRUCT)ExAllocateFromPagedLookasideList(&pageList);
		
	}

	for (ULONG i = 0; i < 500; i++)
	{
		//释放申请的内存
		ExFreeToPagedLookasideList(&pageList, MyObjectArr[i]);
		MyObjectArr[i] = NULL;
		

	}
	//删除Lookasdide对象
	ExDeletePagedLookasideList(&pageList);
	pDriverObject->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值