驱动程序内存分配

如何在 SAP BTP 上通过 CDS view 快速创建 Fiori Elements 应用 本文基于 SAP Business Technology Platform 的 ABAP 编程环境进行的开发。 使用 ABAP Development Tool 登录 SAP BTP ABAP 编程环境,新建一个 package,命名为 Z_JERRY_CDS. 右键选中该 package,创建一个新的 Consumption view. 该视图是一个消费视图,它基于业务对象 (BO) 视图 /DMO/I_TRAVEL_U,提供了独立于消费层的给定数据模型。 它包含在其上运行的应用程序所需的所有核心信息。 阅读详情

一、 何谓可分页和非分页内存
       默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中。而且,加载器是一次加载整个驱动的可执行文件,包括相关的 DLL 。加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件。
但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存( Page out )。可以使用下面的指令来实现:
#define ALLOC_PRAGMA
#pragma alloc_text(PAGE, function_name1)
#pragma alloc_text(PAGE, function_name2)

#endif
      

       由 function_namex 指定的函数代码将被放置于可分页内存中。
使数据段可分页,使用下面的编译指令:
#ifdef ALLOC_PRAGMA
#pragma data_seg(PAGE)

// define your pageeble data section module here.
#pragma data_seg()

要注意,绝不能让可能在高的 IRQL 级别被调用的例程被换出页面。

       可以调用 MmLockPageableCodeSection 和 MmLockPageableCodeSection-
ByHandle
来锁定被标志为可分页的代码段。
可以调用 MmLockPageableDataSection 和 MmLockPageableDataSectionB-
yHandle
来锁定被标志为可分页的数据段
可以调用 MmUnlockPageableImageSection 来解除被上面列出的函数锁定的代码
或数据段。
可以调用 MmPageEntireDriver 使整个驱动程序可分页,覆盖使用编译指令修饰的段的页面属性。
可以调用 MmResetDriverPaging 把页面属性重设回最初描述的属性。

       最后,把那些驱动初始化后不再需要的代码自动丢弃可以使用这些编译指令:
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)

#pragma alloc_text(INIT, function_name) // function called by driverEntry

#endif
驱动程序在执行时可能需要动态分配内存空间,这时你要决定需要的是可分页还是不可分页的内存。如果你的驱动在运行中访问内存的时候能够经受页错误,那么尽量使用可分页内存。
注意:大多数低层磁盘和网络驱动通常不能使用可分页内存,因为他们的代码常常在较高的 IRQL 等级执行而不允许页错误。但是,文件系统(通常比磁盘驱动占用更大,更多资源)有时候可从可分页池中分配一些内存。

 

       非分页内存在整个系统中是一个有限的资源,其数量依赖于系统使用的类型,和系统可用的物理内存。 NT 提供下面的例程给内核驱动来分配内存:

ExAllocatePool

ExAllocatePoolWithQuota

ExAllocatePoolWithTag

ExAllocatePoolWithQuotaTag

调用这些函数来请求内存时,必须要指定请求的内存的类型:

NonPagedPool    请求分配一个不可分页的内存

PagedPool         请求分配一个可分页的内存

           如果你在分配的内存里有任何同步结构的话,决不要分配分页内存。

           当你的应用访问内存时候可以处理页错误的时候,应该指定这个类型。

NonPagedPoolMustSucceed

              在其它方式都失败时,而你又必须立即得到内存的时候可以使用这个标志 类型。注意这种类型的内存是极度缺乏的资源,可能不足 16K 。注意,只 有在其它途径都失败的时候才使用,如果分配失败,将会导致系统的 bugcheck ,错误代码是 MUST_SUCCEED_POOL_EMPTY 。

 

NonPagedPoolCacheAligned

           这个标志分配使用数据缓存线的尺寸来在 CPU 特定的边界对齐的非分页 内存。注意这个操作默认是在 Intel 平台上的 NonPagedPool 分配类型。

 

PagedPoolCacheAligned

           这个标志分配使用数据缓存线的尺寸来在 CPU 特定的边界对齐的分页 内存。

 

NonPagedPoolCacheAlignedMustSucceed

           参考 NonPagedPoolMustSucceed 和 NonPagedPoolCacheAligned

 

 

       内 存池分配器初始化了一些列表,每个列表包含一种固定大小的块。当你使用上面的函数请求内存时,例程试图分配一个和你请求数量相近的或更大一点的固定大小的 块。但是,如果你要求的数量超过一页时,或者超过列表中最大块的大小时,又或者在预先分配的列表中没有可用的块的时候, VMM 就会从任何适当类型的系统可用的内存中分配你请求的数量内存给你。

       当预先分配的列表空了的时候, VMM 会分配至少一页的内存,切分,然后把剩下的数据放进适当的块列表中。但是,当你请求的非分页内存的数量超过 PAGE_SIZE 时候,内存池分配例程不会切分未使用的部分,这会浪费宝贵的非分页内存。

也可以使用 MmAllocateNonCachedMemory 或 MmAllocateContiguousMemory

来分配非分页或物理连续内存。它们通常不使用在文件系统或者过滤驱动中,而是用于执行池例程或者其它结构。

       内核驱动如果重复的分配和释放小块的内存(小于一个 PAGE_SIZE ) , 可能导致系统的可用物理内存碎片化。这会给系统带来各种问题,包括降低系统的性能等。有一个方法可以避免系统碎片化,就是预先分配一块合理大小的内存,然后自已管理,在这个预先分配的块中分配和释放小块的内存,但这种方法有可能会浪费核心内存。

 

二、用池来管理内存

       上面提到用预先分配一块合理大小的内存来自已管理,可以避免系统内存碎片。我们可以用池来管理这块预先分配的内存。必须再次强调,预先分配的内存大小必须足够准确,太大会浪费宝贵的资源。

       调用 ExAllocatePool 来分配池使用的内存,你要选择从分页或者非分页的池中分配,注意你的内存片基址必须在 8 字节的边界对齐。

       还要分配和初始化一个自旋锁或者使用其它的同步机制来保护对内存块列表的修改。注意不要在比 DISPATCH_LEVEL 更高的 IRQL 等级使用池操作例程,因为在更高的 IRQL 等级不能使用同步结构。

       然后定义一个 ZONE_HEADER 结构的全局变量,用来作为这个池的控制结构,并调用 ExInitializeZone 来初始化池头部。然后,就可以通过调用 ExAllocateFromZone 和

ExInterlockedAllocateFromZone 来分配自已管理的内存块。这两个函数的差别在于后者使用了自旋锁用于操作同步。调用 ExFreeToZone 和 ExInterlockedFreeToZone 来释放分配的内存。

       虽然池帮助减少系统内存的碎片,但池还是有一些不足:

1、 驱动程序必须预先为池分配内存,这些内存可能会闲置很久造成内存浪费

2、 你对需要的内存的数量必须相当的精确,在很多时候这个很难做到。

3、 当内存需求增大时,可以扩大池的尺寸,但是却不能减小池的尺寸,直到重启系统

 

lookaside lists

lookaside lists 是 NT4.0 里新的特性,它突破了池的限制。

       当你调用 ExInitializeNPagedLookasideList 和 ExInitializePagedlookasideList 初始化 lookaside lists 时不用预先分配内存,相反,只有当你有真正需要内存的时候才分配。

在初始化时,你必须指定列表的深度,表示尺寸的最大值。相关的函数有 ExAllocateFromN-

PagedLookasideList 和 ExAllocateFromPagedLookasideList 。我们用一个 NPAGED_

LOOKASIDE_LIST 或 PAGED_LOOKASIDE_LIST 结构变量来保存 lookaside lists 的状态,注意这结构一定要从非分页内存中分配。

【软考之软件设计师】学习笔记 interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。 阅读详情

相关推荐

论文分享|ECCV2022,PATnet,Cross-Domain Few-Shot Semantic Segmentation,CDFSS新基准,文末有复现教程

这篇论文提出的跨域小样本语义分割(CD-FSS)任务,旨在将源域学习的分割能力迁移到目标域,仅需少量标注样本。针对传统小样本分割方法在跨域场景性能下降的问题,作者提出了基于金字塔锚点变换的网络(PATNet),通过将域相关特征转换为域无关特征,并引入任务自适应微调推理(TFI)提升目标域适应能力。实验表明,PATNet在1-shot和5-shot设置下分别比现有方法提升8.49%和10.61%的准确率。同时,作者构建了CD-FSS基准并设计了任务难度评估指标。代码和数据集已开源,复现难度中等。

m0_74277350的博客 1093

搜索驱动程序分配的内存和查看KEVENT状态

上周调驱动,总觉得有个线程一直被阻塞在某个KEVENT上,最后费了很大劲才定位。由于代码是公司某个程序的一部分,不能拿出来演示,所以这里借用WinDDK\generate\event来模拟我定位的过程。当然,你可能会觉得这不就是定位有多线程同步引起的死锁吗,有什么难的?用调试器中断调试目标,然后回溯所有线程(类似windbg ~*kb命令)的调用栈不就行了。没错,对于应用程序而言,这样做十有八九已

lixiangminghate的专栏 1024

无线通信入门:3种键控法(ASK/FSK/PSK)原理图解与实战对比

本文深入解析无线通信中ASK、FSK、PSK三种基础键控法的原理与应用。通过图解对比,阐明幅移键控(ASK)简单低成本但抗干扰差,频移键控(FSK)稳健且应用广泛,相移键控(PSK)高效但复杂。文章结合实战场景,为物联网和嵌入式开发者在选型时提供关键指导,帮助平衡数据速率、成本、功耗与抗干扰需求。

weixin_29274969的博客 187

ExAllocatePoolWithTag

功能描述: ExAllocatePoolWithTag函数:根据指定存储区类型参数分配一段空间,并把该空间的首地址作为返回值发送给调用者。 参数说明: PoolType 该参数用来指定想要申请的内存的类型(内核空间中的内存主要分成两类;分页内存区,和未分页内存区)。查询可选的内存区类型可以到MSDN查询POOL_TYPE结构。 您也可以修改该参数,将当前的值和标志POOL_RAISE

扣的CODE 8361

保姆级教程:从WOS下载文献到Citespace出图,手把手搞定科研可视化(附避坑指南)

本文提供从WOS下载文献到Citespace出图的完整科研可视化指南,涵盖数据采集、清洗、环境配置和可视化优化全流程。特别分享WOS检索技巧、数据清洗方法和Citespace参数设置,帮助科研新手高效生成专业图谱,避开常见技术陷阱。

weixin_29311017的博客 170

华为的LTC(Lead to Cash,从线索到现金)流程是其销售管理体系的核心,覆盖了从发现销售线索到最终收回现金的全过程,强调端到端的业务贯通和以客户为中心的运营理念

华为LTC流程是覆盖销售全周期的管理体系,包含四大阶段:线索转机会(LTO)、机会转订单(OTO)、订单转交付(OTD)、交付转现金(DTC)。其核心采用"铁三角"团队模式(AR/SR/FR协作),通过多部门联合评审把控关键节点,实现端到端业务贯通。该流程与IPD、MTL、ITR等体系高效协同,结合iSales平台实现数字化管理,有效提升销售效率、客户满意度和资金回笼速度。

金牌架构师 1718

[驱动程序] 内核内存分配

由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小可以比较大,关于申请内存的大小要根据/proc/meminfo文件中的“VmallocChunk”剩余多少空间可以申请。kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的,可以说是前者是后者的一个变种,因为 kzalloc() 实际上只是额外附加了 __GFP_ZERO 标志。kmalloc() 申请的内存虚拟地址是连续的,对应的物理地址上是连续的,即线性的。

qq_46422460的博客 828

RK3576 USB3.0 DWC3控制器调试:PHY初始化失败排查指南

DWC3 是 Synopsys 公司推出的 USB3.0/3.1 控制器 IP,支持双角色(DRD)模式,可配置为 Host、Device 或 OTG。

小灰灰的博客 1174

linux驱动程序40:页内存分配

linux驱动程序40:页内存分配

dongyoubin的博客 496

Eplan设计师必会—伺服安全回路的设计方法

本文介绍了在EPLAN中设计伺服STO安全回路的方法。首先需查阅伺服驱动器说明书确定STO接线端子,重点关注双通道配置。设计步骤包括:使用黑盒子功能绘制驱动器外形,正确标注STO接线点,并连接安全继电器或PLC的安全输出。关键注意事项有:必须采用双通道独立布线,确保同步动作,遵循故障安全原则,使用常闭触点串联回路。文中以西门子V90和汇川伺服为例说明具体接线要求,并附有项目实例参考。

Qinmingyue13的博客 436

uniapp [安卓苹果App端] - 在“安卓app/苹果app“平台端打包编译后,微信授权登录报错 login:fail [:-1]未能完成操作。(PGWXAPI错误-1。)错误码code:-10

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信授权登录,uniAppAPP端微信登录报错,出现微信确认登录界面后点击登录报错,BundleID,应用ID,微信登录,app微信一键登录,微信登录绑定点确定就出错,AppSecrect,login:fail[:-1]未能完成操作。(PGWXAPI错误-1。),"errCode":-100,"code":-100,在uniappmanifest.json配置了AppSecrect还是报错无

🏆 前端领域优质创作者 3762

驱动程序的内存分配(关于锁定驱动代码和数据常驻内存 学习学习红色标记部分)

默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中。而且,加载器是一次加载整个驱动的可执行文件,包括相关的DLL。加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件。 但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存(Page out)。可以使用下面的指令来实现: #define ALLOC_PRAGMA

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1926

ResNet改进(50):SKConv和CBAM增强的ResNet模型

动态调整感受野大小- 结合通道和空间注意力模型的核心思想是在ResNet的每个残差块后插入这些注意力模块,使网络能够自适应地关注更重要的特征。模型的核心是类,它在标准ResNet34的基础上:替换了初始卷积层,使用更小的核(3×3)和步长(1)在每个残差块后选择性添加SKConv和CBAM模块# 加载预训练ResNet34# 自定义初始层# 添加注意力机制的残差层通过集成SKConv和CBAM,这个改进的ResNet模型能够更有效地捕捉多尺度特征并关注关键信息区域。

2401_82355416的博客 616

Linux系统的硬件驱动程序编写原理

Linux系统的硬件驱动程序编写原理http://www.yesky.com/161/1874161.shtml本文详细地介绍如何Linux系统的硬件驱动程序的编写原理,指出哪些内核例程将会被调用、如何初始化驱动程序及如何分配内存等等。大家一定对Linux操作系统有所了解了,在此本人也不再赘述了。好吧,下面简单地介绍一下设备驱动程序。顾名思义,驱动程序是用来控制计算机外

zhaozhanyong的专栏 1871

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

驱动内存分配

1.传统C分配:malloc原型:extern void *malloc(unsigned int num_bytes);2.驱动程序中:2.1ExAllocatePoolWithTagPVOIDExAllocatePoolWithTag(IN POOL_TYPEPoolType,IN SIZE_TNumberOfBytes,IN ULONGTag );例子:2.2 ...

hutao1101175783的专栏 417

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

window 显示驱动开发-设置内存分配的大小和间距

支持GDI硬件加速的显示微型端口驱动程序在处理内存分配时,需确保正确设置系统或视频内存的大小和音调(Pitch),以支持GDI和桌面窗口管理器(DWM)的高效访问。关键函数包括DxgkDdiCreateAllocation和DxgkDdiGetStandardAllocationDriverData。前者用于创建GPU或CPU可见的内存分配,需根据图面宽度和像素格式计算音调,并设置总大小;后者用于配置GDI/DWM可用的图面属性,如音调、像素格式等。CPU可见的内存分配必须包含音调值,以确保内存对齐和访问效

王马的博客 1373

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: RtlFreeUnicodeString误用引起驱动程序错误
下一篇: 高效时间管理-介绍GTD
lambert_s
博客等级 码龄17年 31粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值