• Lookaside


      频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。DDK提供了Lookaside结构来解决这个问题。可以将Lookaside结构想象成一个内存容器。在初始的时候,它先向Windows申请了比较大的内存。以后每次申请内存的时候,不是直接向Windows申请内存,而是向Lookaside对象申请内存

      

      Lookaside一般会在以下情况下使用:

    1. 程序员每次申请固定大小的内存
    2. 申请和回收的操作十分频繁

      初始化Lookaside:

      1VOID 
        ExInitializeNPagedLookasideList(
          IN PNPAGED_LOOKASIDE_LIST  Lookaside,
          IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
          IN PFREE_FUNCTION  Free  OPTIONAL,
          IN ULONG  Flags,
          IN SIZE_T  Size,
          IN ULONG  Tag,
          IN USHORT  Depth
          );

     

      (2VOID 
        ExInitializePagedLookasideList(
          IN PPAGED_LOOKASIDE_LIST  Lookaside,
          IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
          IN PFREE_FUNCTION  Free  OPTIONAL,
          IN ULONG  Flags,
          IN SIZE_T  Size,
          IN ULONG  Tag,
          IN USHORT  Depth
          );

      申请内存

      ExInitializeNPagedLookasideList()

      ExInitializePagedLookasideList()

      回收内存

      ExFreeToNPagedLookasideList()

      ExFreeToPagedLookasideList()

      删除Lookaside对象

      ExDeleteNPagedLookasideList()

      ExDeletePagedLookasideList()

    //bp Lookaside!DriverEntry
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
    {
    	NTSTATUS Status = STATUS_SUCCESS;
    	PDEVICE_OBJECT  DeviceObject = NULL;
    	DriverObject->DriverUnload = DriverUnload;
    	SeLookaside();
    	return Status;
    }
    VOID SeLookaside()
    {
    	//初始化Lookaside对象
    	int i = 0;
    	PAGED_LOOKASIDE_LIST PagedLookasideList;
    	ExInitializePagedLookasideList(&PagedLookasideList, NULL, NULL, 0, sizeof(ITEM), '8888', 0);
    
    #define ARRAY_NUMBER 50
    	PITEM Item[ARRAY_NUMBER];
    	//模拟频繁申请内存
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		Item[i] = (PITEM)ExAllocateFromPagedLookasideList(&PagedLookasideList);
    	}
    
    	for (i = 0;i<ARRAY_NUMBER;i++)
    	{
    		Item[i]->ItemData = i;
    	}
    
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		DbgPrint("%d
    ", Item[i]->ItemData);
    	}
    	//模拟频繁回收内存
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		ExFreeToPagedLookasideList(&PagedLookasideList, Item[i]);
    		Item[i] = NULL;
    	}
    
    	ExDeletePagedLookasideList(&PagedLookasideList);
    	//删除LookasidePagedLookasideList
    }
    
    VOID DriverUnload(PDRIVER_OBJECT DriverObject)
    {
    	DbgPrint("DriverUnload()
    ");
    }
    

      

  • 相关阅读:
    linux 还能这么来
    JS还能这么来
    FFmpeg常用命令
    golang gin框架默认打印日志写入到文件 (http请求打印写入到文件而不是控制台)
    社保、新农合介绍以及报销比例介绍
    Lightroom 快捷键集合
    golang map基础使用-初始化
    SOLID
    java dump
    Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
  • 原文地址:https://www.cnblogs.com/lsh123/p/7372962.html
Copyright © 2020-2023  润新知