`
com_xpp
  • 浏览: 349770 次
社区版块
存档分类
最新评论

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

 
阅读更多

1. Lookaside结构

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

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

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

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

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

要使用Looaside对象,首先要初始化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
);

(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对象后,可以进行申请内存的操作了:

1PVOID
ExAllocateFromNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST
Lookaside
);

2PVOID
ExAllocateFromPagedLookasideList(
IN PPAGED_LOOKASIDE_LIST
Lookaside
);

Lookaside对象回收内存:

1VOID
ExFreeToNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST
Lookaside,
IN PVOID
Entry
)

2VOID
ExFreeToPagedLookasideList(
IN PPAGED_LOOKASIDE_LIST
Lookaside,
IN PVOID
Entry
);

在使用完Lookaside对象后,要删除Lookaside对象:

1VOID
ExDeleteNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST
Lookaside
);

(2) VOID
ExDeletePagedLookasideList(
IN PPAGED_LOOKASIDE_LIST
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
);

3)填充内存

VOID
RtlFillMemory(
IN VOID UNALIGNED
*Destination,
IN SIZE_T
Length,
IN UCHAR
Fill
);

VOID
RtlZeroMemory(
IN VOID UNALIGNED
*Destination,
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
);


分享到:
评论

相关推荐

    windows驱动开发技术详解-part2

     第5章 Windows内存管理  本章围绕着驱动程序中的内存操作进行了介绍。在驱动程序开发中,首先要注意分页内存和非分页 内存的使用。同时,还需要区分物理内存地址和虚拟内存地址这两个概念。  5.1 内存管理概念...

    Windows驱动开发技术详解的光盘-part1

     第5章 Windows内存管理  本章围绕着驱动程序中的内存操作进行了介绍。在驱动程序开发中,首先要注意分页内存和非分页内存的使用。同时,还需要区分物理内存地址和虚拟内存地址这两个概念。  5.1 内存管理概念 ...

    内存管理(AWE)——例程源码完成端口通讯服务器(IOCP Socket Server)设计(二)

    其它大道理本文不多说,关于操作系统内存管理的原理可以从《Windows核心编程》、《Windows操作系统》、《操作系统》等书籍上了解。 我们可以使用lookaside lists技术来重新使用已经分配的内存的,或者使用...

    论BTB和I-TLB的作用

    论BTB和I-TLB的作用 BTB(Branch Target Buffer ),即分支目标缓冲。在Nehalem的指令拾取单元中包含有相关指令指针(relative instruction point,RIP),每个线程状态各有一个。 而I-TLB,Instruction Translation ...

    030105DNS服务器搭建

    options { listen-on port 53 { any; }; //listen-on-v6 port 53... dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic";

    The Indispensable PC Hardware Book - rar - part1. (1/7)

    2. Introduction to Microprocessor Technology. The Field-effect Transistor. Basics of Machine-related Information Representation. Decimal and Binary Systems. ASCII Code. Negative Integers and...

    Winsock 完成端口模型封装的全新类

    我在C语言下用完成端口模型写了一个WEBSERVER,前些天,我决定用C++重写这个WEBSERVER,给这个WEBSERVER增加了一些功能,并改进完成端口操作方法,比如采用AcceptEx来代替accept和使用LOOKASIDE LIST来管理内存,...

    SkyEye教程

    存储器管理单元和缓存单元 MMU(Memory Management Unit)即存储器管理单元,是用来管理虚拟内存系统的硬件。MMU的两个主要功能是:将虚地址转换成物理地址;控制存储器的存取权限。MMU关掉时,虚地址直接输出到...

    gcegrpc:gRPC客户端服务器在Google Compute Engine和Google App Engine上运行loadbalancedfailover

    在GKE和Istio上运行gRPC的示例: 具有L7入口的GKE上的gRPC负载平衡 client_grpc_app (via gRPC wire protocol) --> ingress --> (grpc Service on GKE) 文件夹: gke_ingress_lb/ 使用TrafficDirector在GKE...

    ispconfig-dnssec:将dnssec添加到区域并清理,绑定配置

    设置是来自NS1的NS2镜像dns。 https://www.howtoforge.com/how-to-run-your-own-dns-servers-primary-and-secondary-with-ispconfig-3-debian-squeeze在两个/所有名称服务器上启用dnssec nano /etc/bind/named.conf...

    Windows驅動程式開發(3)

    內存管理的概念 在驅動中使用鏈表 Lookaside結構與應用 運行時函數

    使用Huagepage和PGO来提升PHP7的执行性能

    关于Hugepage是啥,简单的说下就是默认的内存是以4KB分页的,而虚拟地址和内存地址是需要转换的, 而这个转换是要查表的,CPU为了加速这个查表过程都会内建TLB(Translation Lookaside Buffer), 显而易见如果虚拟...

    Principles of Computer Architeture

    7.7.6 THE TRANSLATION LOOKASIDE BUFFER 289 7.8 ADVANCED TOPICS 291 7.8.1 Tree decoders 291 7.8.2 Decoders for large RAMs 292 TABLE OF CONTENTS xvii 7.8.3 Content-Addressable (Associative) Memories ...

    Visual C++ 编程资源大全(英文源码 DLL)

    compare and find operations with 2 dimensional arrays and maps (11KB)<END><br>56,lookaside_src.zip A simple way to keep items such as COM instances 'warm' and available for reuse (3KB)<END><br>57,...

    MIPS_R4000_Microprocessor_Users_Manual.pdf

    Chapter 2 is an overview of the CPU instruction set. Chapter 3 describes the operation of the R4000 instruction execution pipeline, including the basic operation of the pipeline and interruptions that...

    summershum:提取源文件哈希值的 fedmsg 消费者

    每当贡献者将新的源 tarball 上传到后备缓存时,summershum 将下载该 tarball,解压缩它,并计算 tarball 中每个文件的 sha1 总和。 然后将这些散列存储在数据库中以供稍后查询。 一个 cli 工具summershum-cli查询...

    MA245x_DB-R_v1.02_Spetek.pdf

    Table of Contents 1 Myriad 2 Platorm...................................................................................................................6 ...4.3 Translanon Lookaside Bufer..............

    【Linux Device Driver】(3edtion).pdf

    Lookaside Caches 217 get_free_page and Friends 221 vmalloc and Friends 224 Per-CPU Variables 228 Obtaining Large Buffers 230 Quick Reference 231 9. Communicating with Hardware . . . . . . . . . . . . ...

Global site tag (gtag.js) - Google Analytics