Ring0 - Lookaside结构
由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用Lookaside.
1.每次申请固定大小的内存.
2.申请和回收的操作十分频繁.
实现原理:
他先向windows申请了一块比较大的内存.而后以后申请内存都从Lookaside对象申请.这样就会避免内存"空洞",Lookaside对象内部的内存不够用时,他会向操作系统申请更多内存.当Lookaside内部有大量的未使用的内存时,他会自动让windows回收一部分内存.总之Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。
初始化Lookaside
//分页
VOID
ExInitializePagedLookasideList (
_Out_ PPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size,
_In_ ULONG Tag, //随便写
_In_ USHORT Depth //保留.必须是零.
);
//不分页
VOID
ExInitializeNPagedLookasideList (
_Out_ PNPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size, //每个非分页条目的大小,即字节的大小
_In_ ULONG Tag,
_In_ USHORT Depth //保留.必须是零
);
#include <ntifs.h> typedef struct _ITEM_
{
ULONG ItemData;
}ITEM, *PITEM; void LookasideTest(); VOID DriverUnload(PDRIVER_OBJECT DriverObject); #include "Lookaside.h" //bp Lookaside!DriverEntry
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL; DriverObject->DriverUnload = DriverUnload; LookasideTest(); return Status;
} void LookasideTest()
{
//初始化Lookaside对象
int i = ;
PAGED_LOOKASIDE_LIST PagedLookasideList; ExInitializePagedLookasideList(
&PagedLookasideList,
NULL, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
NULL,
,
sizeof(ITEM),
'',//ulong 4位数字
//保留.必须是零.
);//分页 #define ARRAY_NUMBER 50
PITEM Item[ARRAY_NUMBER];
//模拟频繁申请内存
for (i = ; i < ARRAY_NUMBER; i++)
{
Item[i] = (PITEM)ExAllocateFromPagedLookasideList(
&PagedLookasideList);
} for (i = ; i < ARRAY_NUMBER; i++)
{
Item[i]->ItemData = i;
} for (i = ; i < ARRAY_NUMBER; i++)
{
DbgPrint("%d\r\n", Item[i]->ItemData);
}
//模拟频繁回收内存
for (i = ; i < ARRAY_NUMBER; i++)
{
ExFreeToPagedLookasideList(
&PagedLookasideList,
Item[i]
); Item[i] = NULL;
} ExDeletePagedLookasideList(&PagedLookasideList);
//删除LookasidePagedLookasideList } VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload()\r\n");
}
Ring0 - Lookaside结构的更多相关文章
- Windows内存管理(2)--Lookaside结构 和 运行时函数
1. Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...
- 由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)
是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其 ...
- Lookaside
频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存.DDK提供了Lookaside结构来解决这个问题.可以将Lookaside结构想象成一个内存容器.在初始的时候,它先向W ...
- [Windows驱动开发](四)内存管理
一.内存管理概念 1. 物理内存概念(Physical Memory Address) PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字 ...
- 《Windows驱动开发技术详解》之Windows内存管理
虚拟内存地址 Windows所有的程序(Ring0和Ring3层)可以操作的都是虚拟内存.有一部分单元会和物理内存对应起来,但并非一一对应,多个虚拟内存页可以映射同一个物理内存页.还有一部分单元会被映 ...
- Windows内核中的内存管理
内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...
- ring0 与 ring3 层之间的交互
在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoCon ...
- SSDT Hook结构
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- Linux基础系列—Linux体系结构和Linux内核结构
/** ****************************************************************************** * @author 暴走的小 ...
随机推荐
- Django之路由配置系统(urlConfig)
简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http ...
- 最大值最小值(max,max_element)
min 如果比不出大小就返回第一个引数 //版本一:调用operator< template <class LessThanComparable> const LessThanCom ...
- CSS vertical-algin的使用
一.什么vertical-algin vertical的意思就是垂直,algin是对齐的意思,连起来就是“垂直对齐方式”,接下来看看vertical-algin有哪些属性,打开浏览器一看 vertic ...
- TypeScript 与 es6 写法的区别
import 方式 ts 默认对于 commonjs 的模块是这样加载的:import * as React from 'react'; es6:import React from 'react'; ...
- tp5服务器验证案例
1.验证器代码 <?php namespace app\user\validate; use think\Validate; use Potting\IDCard; /** * 山区治理报名验证 ...
- Linux Shell脚本中获取本机ip地址方法
ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" 命令解释 ...
- windows 下 Anaconda 安装 TensorFlow
转自: https://www.cnblogs.com/nosqlcoco/p/6923861.html 什么是 Anaconda? Anaconda is the leading open data ...
- JavaScript跟踪-Piwik
1.先决条件:使用新版本的JavaScript跟踪代码 2.JavaScript跟踪代码的功能 (1)自定义在Piwik中显示的页面名称 (2)手动触发目标转化 (3)考虑一个主机的“别名”,不将这个 ...
- 阅读<Video Timing Controller>笔记
阅读<Video Timing Controller>笔记 1.Video Timing Controller Block Diagram 2.Example Video Timing ...
- Mule ESB 介绍
Mule ESB 介绍 博客分类: ESB ESB 1. 简介 Mule ESB是一个基于Java的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换.Mule ...