频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。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\r\n", 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()\r\n");
}

  

Lookaside的更多相关文章

  1. Translation Lookaside Buffer

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In principle, then, e ...

  2. 全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存

    全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存 前言: 本文学习思路是:存在缘由   --> 存在好处 --> 定义性质 --> 具 ...

  3. windows内核驱动内存管理之Lookaside使用

    Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...

  4. Ring0 - Lookaside结构

    由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".这时使用Lookaside. 1.每次申请固定大小的内存. 2.申请和回收的操作十分频繁. 实现原理: 他先向wind ...

  5. 使用 Lookaside List 分配内存

    1. 概述 windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式.每次从 look ...

  6. Windows内存管理(2)--Lookaside结构 和 运行时函数

    1.      Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...

  7. 【转】TLB(Translation Lookaside Buffers,TLB)的作用

    原文网址:http://sdnydubing.blog.163.com/blog/static/137470570201122810503396/ 从虚拟地址到物理地址的转换过程可知:使用一级页表进行 ...

  8. PatentTips - Virtual translation lookaside buffer

    BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VM monitor) typically runs on a ...

  9. Linux0.11内核--加载可执行二进制文件之2.change_ldt

    前面分析完了copy_strings函数,这里来分析另一个注意的函数change_ldt. 先来看调用处: // 根据a_text 修改局部表中描述符基址和段限长,并将参数和环境空间页面放置在数据段末 ...

随机推荐

  1. spring cloud: Hystrix(六):feign的注解@FeignClient:fallbackFactory(类似于断容器)与fallback方法

    fallbackFactory(类似于断容器)与fallback方法 feign的注解@FeignClient:fallbackFactory与fallback方法不能同时使用,这个两个方法其实都类似 ...

  2. RepBaseRepeatMaskerEdition下载 | RepeatMasker

    开源的生物信息世界居然有这么个需要注册才能下载的工具,开源世界不是怎么方便怎么来吗? 这个注册真的麻烦,这里上传了一个可以使用的版本. RepBaseRepeatMaskerEdition-20170 ...

  3. 框架设计——View

    [demo]: ZZSZYFP : UserControl, INavigateMdiControl(1)继承自UserControl,并实现了 INavigateMdiControl接口(2)限制表 ...

  4. You Don't Know JS: this & Object Prototypes( 第5章 Prototypes)

    qu上章提到过[[prototype]] chain, 本章详细分析 ⚠️所有试图模仿类复制的行为,如上章提到的mixins的变种,完全规避了[[Prototype]] chain机制,本章会谈到这方 ...

  5. android -------- Data Binding的使用 ( 六) 自定义属性

    今天来说说DataBinding在自定义属性的使用 默认的android命名空间下,我们会发现并不是所有的属性都能直接通过data binding进行设置,比如margin,padding,还有自定义 ...

  6. android -------- Eclipse选择NDK路径时 “Not a valid NDK directory”

    在 Eclipse选择NDK路径时 出现 “Not a valid NDK directory”  这样的错误 解决方式1 在你安装的ndk的主目录下创建一个ndk-build空文件,然后重新打开对话 ...

  7. Android -------- MVC,MVP 和 MVVM 架构设计模式

    MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了. 一.MVC MV ...

  8. CentOS7 安装redis4:

      phpredis-4.0.12.tar.gz:下载:wget http://download.redis.io/releases/redis-4.0.12.tar.gz   $ tar -zxvf ...

  9. LitePal 数据库使用方法(最新2.0LitePal数据库适用)

    转发郭神的blog,讲的非常详细,是基于1.6版本,但现在使用的是2.0,有点差别https://blog.csdn.net/guolin_blog/article/details/384612391 ...

  10. Single Number II leetcode java

    问题描述: Given an array of integers, every element appears three times except for one. Find that single ...