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. 关于nodejs+koa中的跨域问题与koa项目创建

    项目快速创建 -1. 安装koa-generator npm install -g koa-generator -2. 使用koa-generator生成koa2项目, koa2 test -3. 完 ...

  2. 深入理解Magento – 第七章 – 自定义Magento系统配置

    Magento拥有十分强大的后台管理系统.作为一名开发人员,这套后台管理系统可以让你的用户简单直接的配置Magento系统或者你创建的模块.和Magento的其他功能一样,你第一次使用这套管理系统的时 ...

  3. Delphi COM对象

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

  4. 【Flutter学习】基本组件之容器组件Container

    一,前言 Flutter控件本身通常由许多小型.单用途的控件组成,结合起来产生强大的效果,例如,Container是一种常用的控件,由负责布局.绘画.定位和大小调整的几个控件组成,具体来说,Conta ...

  5. Luogu P2042 [NOI2005]维护数列

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格) 输入输出格式 输入格式: 输入文件的第 1 行包含两个数 N 和 M, ...

  6. JZOI1142 排队布局

    #include <bits/stdc++.h> using namespace std; inline int read() { int x = 0,tmp = 1;char ch = ...

  7. Java桌球小游戏1

    版本三.使小球动起来package cn.xjion.game;/** * 水平滚动 * @author xjion * */import java.awt.*;import javax.swing. ...

  8. 2018—2019—2 20165239《网络对抗技术》Exp7 网络欺诈防范

    一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET工具建立冒名网站 (1分) ettercap DNS ...

  9. android studio import cannot resolve symbol错误

    试了好多,都不行 经过查阅和测试,发现如果上文的解决方式不可以的话,可以使用另一种: 删除项目.idea目录下的libraries目录 重新启动Android Studio 感谢作者:https:// ...

  10. 海外版本Google登录

    海外版本: 1.安裝谷歌安裝器:手机浏览器搜索“谷歌安装器”,安装酷安的好一些,地址: https://www.coolapk.com/apk/com.goplaycn.googleinstall 2 ...