Lookaside
频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。DDK提供了Lookaside结构来解决这个问题。可以将Lookaside结构想象成一个内存容器。在初始的时候,它先向Windows申请了比较大的内存。以后每次申请内存的时候,不是直接向Windows申请内存,而是向Lookaside对象申请内存。
Lookaside一般会在以下情况下使用:
- 程序员每次申请固定大小的内存。
- 申请和回收的操作十分频繁。
初始化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
);
申请内存:
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的更多相关文章
- Translation Lookaside Buffer
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In principle, then, e ...
- 全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存
全面学习理解TLB(Translation Look-aside Buffer)地址变换高速缓存 前言: 本文学习思路是:存在缘由 --> 存在好处 --> 定义性质 --> 具 ...
- windows内核驱动内存管理之Lookaside使用
Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...
- Ring0 - Lookaside结构
由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".这时使用Lookaside. 1.每次申请固定大小的内存. 2.申请和回收的操作十分频繁. 实现原理: 他先向wind ...
- 使用 Lookaside List 分配内存
1. 概述 windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式.每次从 look ...
- Windows内存管理(2)--Lookaside结构 和 运行时函数
1. Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...
- 【转】TLB(Translation Lookaside Buffers,TLB)的作用
原文网址:http://sdnydubing.blog.163.com/blog/static/137470570201122810503396/ 从虚拟地址到物理地址的转换过程可知:使用一级页表进行 ...
- PatentTips - Virtual translation lookaside buffer
BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VM monitor) typically runs on a ...
- Linux0.11内核--加载可执行二进制文件之2.change_ldt
前面分析完了copy_strings函数,这里来分析另一个注意的函数change_ldt. 先来看调用处: // 根据a_text 修改局部表中描述符基址和段限长,并将参数和环境空间页面放置在数据段末 ...
随机推荐
- 雷林鹏分享:XML 属性
XML 属性 XML元素具有属性,类似 HTML. 属性(Attribute)提供有关元素的额外信息. XML 属性 在 HTML 中,属性提供有关元素的额外信息: 属性通常提供不属于数据组成部分的信 ...
- 管家基因 | Human housekeeping genes
管家基因就是在细胞里稳定表达的基因,及时在胁迫状态下,表达的差异也不大. 以前做实验的时候就经常听说管家基因,因为在做RT-PCR的时候需要同时检测管家基因,这样可以用于矫正我们不同批次的结果. Li ...
- c# winform 中的坐标系
从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Siz ...
- 20180226xlVbaGetStockData
Sub LoopGetStockData() Dim StartTime As Variant Dim UsedTime As Variant StartTime = VBA.Timer Cells. ...
- php数组的逐行写入文件与读取
<?php /** * * 对数组$arr1=['Apple Orange Banana Strawberry'] 写入文件,并读取 **/ class IoFile { private $pa ...
- 非常可乐 HDU - 1495
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...
- SSM框架中各层作用
SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...
- python装饰器概念与应用
格式一:装饰器外层不传参,内层传参 user_status = False # 用户登录了就把这个改成True def login(func): # 把要执行的henan模块从这里传进来 def in ...
- yum源仓库搭建
系统:centos7 一.安装nginx yum install -y nginx yum install -y createrepo 安装建yum源仓库的工具,可以用来建立yum仓库yum ...
- python--model进阶
一.QuerySet 1.可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Entry.objects.a ...