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. thinkphp IP获取和定位

    系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...

  2. Android中的surfaceHolder.lockCanvas(null)返回为null详解

    对于新手学习SurfaceView的时候获取lockCanvas的时候总是返回null的问题很是纠结 canvas = surfaceHolder.lockCanvas(new Rect(0, 0, ...

  3. 听说江苏省没有webSocket服务硬件

    听说江苏省没有webSocket服务硬件 昨天项目上线,我门开发采用的webSocket做实时轮询,然后开发部老总怒怼"江苏省没有webSocket服务硬件,江苏省没有webSocket服务 ...

  4. python 生成json格式文件,并存储到手机上

    上代码 #!/usr/bin/env python # -*- encoding: utf-8 -*- import json import os import random "" ...

  5. JAVA学习之Java程序开发初次体验

    Java环境搭建算完成了,那么接下来写个Java程序走一个 开发Java程序的简单流程 1.将Java代码编写到扩展名为.java的文件中2.通过javac命令对该Java文件进行编译(生成class ...

  6. P2216 [HAOI2007]理想的正方形 (单调队列)

    题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...

  7. js小项目:显示与输入的内容相关的

    1,添加键盘抬起事件 2,获取文本框的内容,是否与数组中的内容匹配 3,创建元素 <!DOCTYPE html> <html lang="en"> < ...

  8. 关于scroll实现侧边导航栏

    需求为一个简单的scroll效果,侧边选项卡跟随屏幕向下拖动变颜色的.点击侧边选项卡,跳转到相应模块. 索性上网找了一下类似的效果.附带源码地址  https://blog.csdn.net/drea ...

  9. python中 try、except、finally执行顺序

    我们虽然经常用到try...except 作为异常补货,但是其实很少去研究try源码和机制,也许点进去看过,也是看不出个所以然来 class Exception(BaseException): &qu ...

  10. GCloud SDK 遇到的错误记录

    eclipse 环境 1.调用 SetAppInfo 方法返回 -1 语音id 和 key 设置正确 ,各种检测都没问题 解决办法 把安卓工程目录下 obj 文件价删除 ,把sdk 替换成以前能用的老 ...