1.      Lookaside结构

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

我们可以将Lookaside对象看成是一个内存容器。在初始化的时候,它先向Windows申请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向Windows申请内存,而是想Lookaside对象申请内存。Looaside会智能的避免产生内存“空洞”。如果Lookaside对象内部内存不够用时,它会向操作系统申请更多的内存。

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

1.       程序员每次申请固定大小的内存。

2.       申请和回收的操作十分频繁。

要使用Looaside对象,首先要初始化Lookaside对象,有以下两个函数可以使用:

(1)VOID 

  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

    );

(2)VOID 

  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

    );

 

Lookaside对象回收内存:

(1)VOID 

  ExFreeToNPagedLookasideList(

    IN PNPAGED_LOOKASIDE_LIST
  Lookaside,

    IN PVOID
  Entry

    )

 

(2)VOID 

  ExFreeToPagedLookasideList(

    IN PPAGED_LOOKASIDE_LIST
  Lookaside,

    IN PVOID
  Entry

    );

 

测试代码:

#pragma INITCODE

VOID LookasideTets()

{

KdPrint(("进入LookasideTest函数!\n"));

PAGED_LOOKASIDE_LIST  Lookaside;

ExInitializePagedLookasideList(&Lookaside, NULL, NULL, 0, sizeof(MYDATASTRUCT),
'abcd', 0);

PMYDATASTRUCT pMyData[50];

for (int i=0; i<50; i++)

{

pMyData[i] = (PMYDATASTRUCT)ExAllocateFromPagedLookasideList(&Lookaside);

if ((i+1)%10 == 0)

{

KdPrint(("申请了 %d 个数据了!\n", ++i));

}

}

for (int i=0; i<50; i++)

{

ExFreeToPagedLookasideList(&Lookaside, pMyData[i]);

pMyData[i] = NULL;

if ((i+1)%10 == 0)

{

KdPrint(("释放了 %d 个数据的内存了!\n", ++i));

}

}

ExDeletePagedLookasideList(&Lookaside);

}

2.运行时函数

(1)内存间复制(非重叠)

VOID 

  RtlCopyMemory(

    IN VOID UNALIGNED  *
Destination,

    IN CONST VOID UNALIGNED  *
Source,

    IN SIZE_T
  Length

    );

 

(2)内存间复制(可重叠)

VOID 

  RtlMoveMemory(

    IN VOID UNALIGNED
  *Destination,

    IN CONST VOID UNALIGNED  *
Source,

    IN SIZE_T
  Length

    );

 

4)内存比较

SIZE_T 

  RtlCompareMemory(

    IN CONST VOID
  *Source1,

    IN CONST VOID
  *Source2,

    IN SIZE_T
  Length

    );

ULONG

  RtlEqualMemory( 

    CONST VOID  *
Source1

    CONST VOID  *
Source2

    SIZE_T
  Length 

    );

测试代码:

#define BUFFER_SIZE 1024

#pragma INITCODE

VOID RtlTest()

{

KdPrint(("进入RtlTest函数!\n"));

PUCHAR pBuffer1 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);

RtlZeroMemory(pBuffer1, BUFFER_SIZE);

PUCHAR pBuffer2 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);

RtlFillMemory(pBuffer2, BUFFER_SIZE, 0xAA);

RtlCopyMemory(pBuffer1, pBuffer2, BUFFER_SIZE);

if (RtlEqualMemory(pBuffer1, pBuffer2, BUFFER_SIZE))

{

KdPrint(("两块内存块数据一样!\n"));

for(int i=0; i<BUFFER_SIZE; i++)

{

KdPrint(("%02X", pBuffer1[i]));

}

}

else

{

KdPrint(("两块内存块数据不一样!\n"));

}

KdPrint(("离开RtlTest函数!\n"));

}


Windows内存管理(2)--Lookaside结构 和 运行时函数的更多相关文章

  1. 你必须了解的java内存管理机制(一)-运行时数据区

    前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...

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

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

  3. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  4. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  6. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  7. Windows内存管理的方式

    一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...

  8. windows 内存管理的几种方式及其优缺点

    windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地 ...

  9. 20140919 进程间通信 系统栈 用户栈 多级反馈队列 windows 内存管理

    1.进程间通信 共享内存(剪切板) 匿名管道只能实现父子进程间的通信(以文件系统为基础): 匿名管道是什么,有什么用,怎么用 1.创建父进程,也就是在解决方案中建立一个parent的工程 2.在par ...

随机推荐

  1. Delphi COM对象

    作者:巴哈姆特  http://www.cnpack.org(转载请注明出处并保持完整) 如果没有接触过COM对象的话,你会觉得接口真的很麻烦,也许会有:“还不如直接定义一个类更方便”的想法. 的确, ...

  2. 排序+并查集——cf1213F

    /* 有向边(pi,pi+1),形成链后进行dfs,求出dfs序 一个联通块内的元素必须是同一个字符,如果最后的联通块个数<k,说明不行 */ #include<bits/stdc++.h ...

  3. ueditor不能上传mp4格式的视频--解决方案

    1.ueditor.all.js 去掉所有的 type="application/x-shockwave-flash" 2.ueditor.all.min.js 去掉所有的 typ ...

  4. Java-框架-Dubbo:Dubbo

    ylbtech-Java-框架-Dubbo:Dubbo Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成 ...

  5. 22. Jmeter NON GUI模式

    一般情况下我们都是在NonGUI模式下运行jmeter.这样做有两个好处 节省系统资源,能够产生更大的负载 可以通过命令行参数对测试场景进行更精细的配置 需求:模拟5个用户同时访问百度首页的情况 步骤 ...

  6. PAT_A1055#The World's Richest

    Source: PAT A1055 The World's Richest (25 分) Description: Forbes magazine publishes every year its l ...

  7. vue-lic脚手架中引入font-awesome

    1.安装font-awesome npm i font-awesome --production 2.在main.js中引用 import 'font-awesome/css/font-awesome ...

  8. 爬虫抓取5大门户网站和电商数据day1:基础环境搭建

    最新想用爬虫实现抓取五大门户网站(搜狐.新浪.网易.腾讯.凤凰网)和电商数据(天猫,京东,聚美等), 今天第一天先搭建下环境和测试. 采用maven+xpath+ HttpClient+正则表达式. ...

  9. 全网最热Python3入门+进阶 更快上手实际开发✍✍✍

    全网最热Python3入门+进阶 更快上手实际开发  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问 ...

  10. 2019-9-25-如何让-USB-设备不显示安全删除硬件弹出选项

    title author date CreateTime categories 如何让 USB 设备不显示安全删除硬件弹出选项 lindexi 2019-09-25 11:58:19 +0800 20 ...