tiechui_lesson08_内存的分配和链表

news2024/10/5 19:19:31

主要是将链表结构的使用,在内核开发中使用起来比较方便的一种数据结构【LIST_ENTRY】。

一、内存的分配

主要是学习一些基本操作。现在推荐使用的动态分配函数【ExAllocatePoolWithTag

PVOID tempbuffer = ExAllocatePoolWithTag(NonPagedPool, 0x1000, 'xxaa');

 这样可以通过工具来找到标签对应的内存地址,我没找到视频里的【PoolMonEX.exe】,但是找到了【PoolMonX.exe】这个程序也可以用🤣

可以看到实际上的内容是和代码里边的顺序相反的,而且我之前申请的【‘aaxx’】非分页内存块,在驱动卸载后没有被释放掉(故意没free,驱动卸载不会自动释放),这样就只能重启操作系统了。

这个函数的第一参数确定这块内存的形式:

  • 【 PagedPool 】分页池—在需要时能够将页面换出的内存池
  • 【 NonPagedPool 】非分页池—永远不会换出页面,保证驻留在RAM里的内存池

 引用书中的描述,我觉非常好,虽然第一次看的时候没什么感觉😗😗😗

很显然,非分页池是一个“更好”的内存池,因为它不会导致页 面错误。在本书的后面我们会看到一些需要从非分页池分配的例子。 驱动程序要尽可能少地使用非分页池,除非必需。其他任何情况驱动 程序都应该使用分页池。POOL_TYPE这个枚举类型表示内存池的类型。 这个枚举类型包括很多内存池的“类型”,但是只有三种可以被驱动 程序使用:PagedPool、NonPagedPool和NonPagePoolNx(没有执行权限 的非分页池)。

 除此之外,在tiechuiDL视频中提到了更多的参数,在头文件【wdm.h】有这样的定义:

 【NonPagedPoolCacheAligned】传入这个参数,有一个对齐的概念,就是要求操作系统分配的这个内存是宽度对齐的。宽度的大小和寻址基线有关系,比方说32位系统就是四字节对齐,64位就是8字节对齐。

 【NonPagedPoolMustSucceed】传入这个参数,就要求操作系统必须分配成功一个非分页内存。

【NonPagedPoolCacheAlignedMustS】传入这个参数,是上边的超级组合:非分页+字节对齐+必须成功!

1.调试看细节

接下来是双机调试的骚操作,真的炫呀,tiechuiDL的双机调试连接怎么这么快!我就暂时用了WinDbg来看(VS2019调试Win7一直gg😒):

先搞一下入口断点:

bu ListEntry!driverentry

进入入口函数后使用Windbg打断点:

 之后使用g命令跳出,就和视频里边一样命中断点调试了...(还是好奇为啥tiechuiDL这么快???

【 bl 】查看已经打过的断点:

 【 dv /v 】查看变量状态

 【 db 0xfffffa80`1b178000 】查看tempbuffer内存地址的变化

 清零之后【RtlZeroMemory(tempbuffer, 0x1000);

 填充之后【RtlFillMemory(tempbuffer, 0x1000, 0xcc);

释放之后【ExFreePoolWithTag(tempbuffer, 'dcba');】中断一下再看,被别的进程用了...

调试就这样了,学到了咋通过命令看内存,然后介绍了两个运行时函数,用来内存比较:

  •     RtlCompareMemory
  •     RtlEqualMemory

RtlEqualMemory其实是宏定义而且用的比较多,主要是看一些区域相不相等。

2. Lookaside

最后还有一个概念是【Lookaside】

 Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少了频繁申请内存而导致的内存碎片

当Lookaside对象内部有大量没有使用的内存时候,它会自动让windows回收一部分内存,总之,Lookaside很智能。

 一般Lookaside用于以下情况:

  1. 程序员每次申请固定的内存大小
  2. 申请和回收内存的次数较多,很频繁

其实这个在官网的例子还出现挺频繁的,不过不在这里展开了,下次一定😉

二、链表 LIST_ENTRY

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DJ4-6 层次选路

目录 一、层次选路的基本概念 二、域内路由选择 1、RIP* 2、OSPF 三、域间路由选择 BGP 1、AS 互连 2、AS 域间选路任务 3、示例:在 1d 上设置转发表 4、示例:在多个 AS 中做出选择 5、BGP 会话与通告 6、传播可达信息 7、路径属性和 BGP 路…

马蹄集第四期oj

目录 供水管线 黑客小码哥 逆序 来给单词分类 前k小数(进阶) 前K小数 线段树 队列安排 一元多项式的加法 快排变形 供水管线 难度:钻石 0时间限制:1秒 巴占用内存:128M 在个城市之间原本要规划修建许多条下水管道…

提高开发团队能力 这4点很重要

组建开发团队,提高开发团队能力的前提是需要选对人,不仅需与专业匹配,与公司文化相匹配,更与管理者相匹配。 而团队能力的提升需要重点关注:流程化,标准化、工具化和持续赋能。尤其通过流程化、标准化和工具…

TIM输入捕获-STM32

TIM输入捕获-STM32 IC(Input Capture) 输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕…

Unity 自建package包流程

目录 1.在工程Asset 同级目录下创建文件夹 名字随便起 2.在文件夹中添加package.json 文件 3.在unity中选中PackageManager 4.打开vs 新建一个项目 5.开始编写代码 6.修改dll路径 7.打个dll 1.在工程Asset 同级目录下创建文件夹 名字随便起 eg: 2.在文件夹中添加package…

《MySQL 必知必会》课程笔记(三)

怎么创建和修改数据表? 创建和修改数据表,是数据存储过程中的重要⼀环。我们不仅需要把表创建出来,还需要正确地设置限定条件,这样才能确保数据的一致性和完整性。同时,表中的数据会随着业务需求的变化而变化&#xf…

docker ngxin

安装docker环境 官方安装 官方安装 Install Docker Engine on CentOS | Docker Documentation sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install docker-ce docker-ce-cli container…

在滴滴和字节跳动划水4年,过于真实了...

先简单交代一下吧,沅哥是某不知名211的本硕,18年毕业加入滴滴,之后跳槽到了头条,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家公司&am…

你有了一套采购系统,就数字化转型了吗?

我觉得完全没有达到,我们觉得要把这个系统要应用起来,用得好才能够说明你这个系统真正地做了数字化转型的。 甄云作为采购数字化服务商,在服务客户时,深有感触。 流程断点,但没有充分采购数字化价值 我这边讲一个故事…

Python系列之Linux 安装

目录 一、认识Python 1.1 为什么要学python ? 1.2 Python优点 1.3 Python应用场景 二、源码安装 三、RPM安装 一、认识Python 1.1 为什么要学python ? python的哲学: 明确,优雅,简单 python更强大,执行效率比shell高。 python可以跨平台,可移…

计算机网络的三种交换方式

1.计算机网络的三种交换方式 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 个人理解:交换(Switch)可以理解为切换开关,将交换机中某两个开关打开,使得连接此两个开关的双方建立通信通道 如…

VolSDF

Volume Rendering of Neural Implicit Surfaces(VolSDF):神经隐式曲面的体渲染 摘要:一个神经隐式表面体积渲染框架,将体积密度建模为几何形状的函数来实现表面重建。定义的体积密度函数作为拉普拉斯的累积分布函数&am…

git 解决 “fatal: Could not read from remote repository.“

现象 在使用Git将本地仓库推送到远程仓库的时候,发生了如下错误:“fatal: Could not read from remote repository.” 原因 出现这错误一般是以下两种原因: 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 为解决以上问题&a…

斯坦福2023【FrugalGPT】减少大模型的商业化应用成本

文章目录 主要解决问题采用什么方法Prompt adaptationLLM approximationLLM cascade 实验结论讨论与展望 FrugalGPT: How to Use Large Language Models While Reducing Cost and Improving Performance 主要解决问题 这篇文章主要是要解决如何降低调用大语言模型的成本(Chat…

NMOS双向转换电路实测以及上升沿尖峰处理

NMOS双向转换电路实测以及上升沿尖峰处理 NMOS双向转换电路 &#x1f527;采用的是5V供电的STC8H单片机输出PWM波形&#xff0c;经过上面的电平转换电路测量低压端的波形。 ✨在做3.3V <>5V 电平转换电路方案验证时&#xff0c;输入5V PWM波形和输出波形的波形上升沿有尖…

[Java基础练习-002]综合应用(基础进阶),如果你会做,那说明你java入门了,

本篇的练习是一个综合性的练习&#xff0c;结合了各个知识点&#xff0c;比如选择结构、循环结构、数组等java基础知识。综合性运用比较强。 目录 1、进阶练习一、学习网站&#xff08;主要考察选择结构、输入语句&#xff09; 2、进阶练习二&#xff08;选择结构、循环&#…

SELinux详解

文章目录 SELinux详解什么是SELinux当初设计的目标&#xff1a;避免资源的误用传统的文件权限与账号主要的关系&#xff1a;自主访问控制(DOC)以策略规则制定特定进程读取特定文件&#xff1a;强制访问控制(MAC) SELinux的运行模式安全上下文进程与文件SELinux类型字段的相关性…

QQ邮箱 网易邮箱及企业邮箱开通SMTP/POP3及设置授权码

一 、什么是 POP3/IMAP/SMTP 服务 POP3 &#xff08;Post Office Protocol - Version 3&#xff09;协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP &#xff08;Internet Message Access Protocol&#xff09;协议用于支持使用电子邮件客户端交互式存…

Windows Nvm+Node.js安装

前言 在windows系统下安装的是nvm-windows&#xff0c;nvm只支持安装在在Linux和Mac系统下。之前在Linux上安装过&#xff0c;最近在Windows上安装&#xff0c;特记录一下。 下载 下载地址&#xff1a;传送门 安装Nvm 双击exe文件&#xff0c;选定安装路径&#xff0c;下…

最新|事件相机SLAM综述

Arxiv链接:https://arxiv.org/abs/2304.09793 Github 链接:https://github.com/kun150kun/ESLAM-survey 视觉SLAM (vSLAM)是指移动机器人通过相机感知外部世界并估计机器人的位姿和重建周围环境的三维地图。vSLAM在各种应用中扮演着不可或缺的角色,包括自动驾驶,机器人导航…