UEFI.源码分析.DXE的内存服务.第三部分.HeapGuard

UEFI源码解析之调试环境搭建 UEFI-Edk2源码复杂且BIOS运行依赖主板硬件,学习阶段可通过编译edk2源码包中的模拟器调式edk2的代码结构和运行流程。 1. 依赖环境的安装:Win10下edk2编译环境搭建 Visual Studio community 2017(注册微软账号,避免VS社区版试用阶段过期) EDK2-stable-202002 下载地址:https://github.com/tianocore/edk2/releases/tag/edk2-stable202002 下载源码到本地目录如D:\ 阅读详情
  • 源码EDK2:Tianocore
  • UEFI源码分析系列第二篇,DXE阶段的内存服务
  • 第三部分,HeapGuard
  • DXE阶段源码目录MdeModulePkg/Core/Dxe
  • 基于开篇日(2018/04/18:16:30)时最新的EDk2版本,commit为255101471918ed8840f2be347916b90eef0e9c08

从初始化过程入手

直到CoreAddMemoryDescriptor才找到相关的内容

/** /Dxe/Mem/Page.c **/
 536 VOID                                                                     
 537 CoreAddMemoryDescriptor (                                                
 538   IN EFI_MEMORY_TYPE       Type,                                         
 539   IN EFI_PHYSICAL_ADDRESS  Start,                                        
 540   IN UINT64                NumberOfPages,                                
 541   IN UINT64                Attribute                                     
 542   )                                                                      
 543 {                                                                        
 544   EFI_PHYSICAL_ADDRESS        End;                                       
 545   EFI_STATUS                  Status;                                    
 546   UINTN                       Index;                                     
 547   UINTN                       FreeIndex;                                 
 548                                                                          
 549   if ((Start & EFI_PAGE_MASK) != 0) {                                    
 550     return;                                                              
 551   }                                                                      
 552                                                                          
 553   if (Type >= EfiMaxMemoryType && Type < MEMORY_TYPE_OEM_RESERVED_MIN) { 
 554     return;                                                              
 555   }                                                                      
 556   CoreAcquireMemoryLock ();                                              
 557   End = Start + LShiftU64 (NumberOfPages, EFI_PAGE_SHIFT) - 1;           
 558   CoreAddRange (Type, Start, End, Attribute);                            
 559   CoreFreeMemoryMapStack ();                                             
 560   CoreReleaseMemoryLock ();                                              
 561                                                                          
 562   ApplyMemoryProtectionPolicy (EfiMaxMemoryType, Type, Start,            
 563     LShiftU64 (NumberOfPages, EFI_PAGE_SHIFT));                          

在函数ApplyMemoryProtectionPolicy中多了如下一段代码,主要包含两个函数IsHeapGuardEnabled和IsGuardPage。

1229 EFI_STATUS                           
1230 EFIAPI                               
1231 ApplyMemoryProtectionPolicy (        
1232   IN  EFI_MEMORY_TYPE       OldType, 
1233   IN  EFI_MEMORY_TYPE       NewType, 
1234   IN  EFI_PHYSICAL_ADDRESS  Memory,  
1235   IN  UINT64                Length   
1236   )                                  
1237 {                                    

1269   if (IsHeapGuardEnabled ()) {                           
1270     if (IsGuardPage (Memory))  {                         
1271       Memory += EFI_PAGE_SIZE;                           
1272       Length -= EFI_PAGE_SIZE;                           
1273       if (Length == 0) {                                 
1274         return EFI_SUCCESS;                              
1275       }                                                  
1276     }                                                    
1277                                                          
1278     if (IsGuardPage (Memory + Length - EFI_PAGE_SIZE))  {
1279       Length -= EFI_PAGE_SIZE;                           
1280       if (Length == 0) {                                 
1281         return EFI_SUCCESS;                              
1282       }                                                  
1283     }                                                    
1284   }                                                      

305   return gCpu->SetMemoryAttributes (gCpu, Memory, Length, NewAttributes); 
306 }                                                                         

函数IsHeapGuardEnable显示是用来判断HeapGuard是否Enabled

/** /Dxe/Mem/HeapGuard.c **/
 753 BOOLEAN                                                                   
 754 IsHeapGuardEnabled (                                                      
 755   VOID                                                                    
 756   )                                                                       
 757 {                                                                         
 758   return IsMemoryTypeToGuard (EfiMaxMemoryType, AllocateAnyPages,         
 759                               GUARD_HEAP_TYPE_POOL|GUARD_HEAP_TYPE_PAGE); 
 760 }                                                                         

函数IsMemoryTypeToGuard则是进一步判断对应的内存类型是否Enabled

 661 BOOLEAN                                  
 662 IsMemoryTypeToGuard (                    
 663   IN EFI_MEMORY_TYPE        MemoryType,  
 664   IN EFI_ALLOCATE_TYPE      AllocateType,
 665   IN UINT8                  PageOrPool   
 666   )                                      
 667 {                                        

主要是根据PCD(全局配置数据库)的设置来判断是否Enabled。PCD的相关内容可以参考文献。

如根据PcdHeapGuardPropertyMask判断是否开启了page和pool的Guard。

 685   if ((PcdGet8 (PcdHeapGuardPropertyMask) & PageOrPool) == 0
UEFI源码解析之EVENT UEFI-EDK2是单核单线程的架构,除了时钟中断外,没有其他中断机制,Event在UEFI中实现了异步执行的能力; 阅读详情

相关推荐

UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动

源代码:EDK2 版本:UDK2017 UEFI源码分析第二篇,异步事件服务 第一部分,事件驱动 事件 相关接口 参考文献

随便写写 1688

UEFI源码解析之UEFI_DRIVER

Dxe Driver可以视作UEFI中的一个服务,在entry中通过protocol安装自己的服务,在Bds等位置通过locate protocol使用该服务,不必依赖与具体的硬件。当需要封装某个设备或总线的时候,对应于具体的物理实现,需要用到UEFI Driver的模型实现。UEFI Driver模型实现设备/总线的检测,安装,卸载,更新,启动,停止等;一个Driver可能适配多个设备,一个设备可能连接管理多个子设备等,因此UEFI Driver还可以多次安装

wangadi057612的博客 5086

基于QEMU-aarch64学习UEFI(EDK2)-3分析qemu固件

接着FV又是由多个EFI程序组成,比如第一个FV中,我们看到有SEC、PEI、DXE等各个阶段的EFI组成。这个是第二个FV的guid,继续往下展开,就可以看到第二个FV中的EFI模块。我们打开该文件,可以看到dsc包含了UEFI启动的各个阶段所需的模块和驱动。该文件生成的是QEMU的变量固件,名称为QEMU_VARS.fd。该部分是FD的大小设置,生成的固件名称是QEMU_EFI.fd。可以看到其展开的结构,FD由多个FV组成,FV的guid为。部分,其中是从DXE阶段和BDS阶段的模块。

Rayu 502

qcom 高通UEFI架构BootLoader edk2源码

高通UEFI架构,ABL部分代码,从开源分支拉的,平台为SDM845。

UEFI原理与编程源代码

UEFI原理与编程源代码

edk-ii-dec-specification

EDK II Package Declaration (DEC) File Format Specification

【事件相机实战】噪声识别与智能滤波技术解析

本文深入解析了事件相机应用中关键的噪声识别与智能滤波技术。针对背景活动噪声、阈值波动噪声、热点噪声及运动边缘尾迹等核心噪声类型,文章剖析了其成因与特征,并详细介绍了从经典的时空相关性滤波、热点像素滤除到前沿的深度学习(如EDnCNN)等实战滤波方法,旨在帮助开发者在保证低延迟的前提下,有效提升事件流数据质量。

weixin_29169899的博客 439

MIT Bevfusion环境安装 Docker方式,nuscenes数据处理

Bevfusion环境安装,数据生成报错解决module 'numpy' has no attribute 'long';most likely due to a circular import。bevfusion docker环境

Jack_Man_N的博客 1143

金蝶云星空应用开发初级考试题目汇总

摘要:本文为金蝶云星空应用开发初级考试题目汇总

2401_86113757的博客 3799

SCI、中科院1区算法应用:(BWO-CNN-BiGRU-Attention)白鲸优化深度学习-融合注意力机制预测程序代码!包含特征可视化,数据Excel导入,直接运行!

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

weixin_48747334的博客 3261

【AutoCAD中实现双击文本编辑功能】

例如:以下是官方博客例子浅析先加入相关的头文件和库文件。在AutoCAD中有一个很重要的功能,就是双击图形尺寸或文本后会出现一个文本编辑框,用户可在该编辑框中修改文字。本文介绍了如何使用AcEdInplaceTextEditor来实现该功能。实现cad的消息监听。创建一个消息监听的类并在cad中注册来实现消息监听。主要是监听键盘输入。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了的函数和方法。

我的博客 1148

Autosar诊断实战系列07-Dcm之0x19 06扩展数据配置及工程问题讨论

19 06扩展数据如何配置?如果某DTC没有出现过故障扩展数据该如何响应?

initiallizer的博客 1703

VTK实战完整教程介绍

该专栏以VTK提供的Example为基础,讲解VTK中的相关接口和使用方法。订阅该专栏,带你了解所有VTK的功能,以便VTK更好的解决工作中遇到的问题。一起学习起来吧!

qq_40041064的博客 2503

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: UEFI.源码分析.DXE的内存服务.第二部分.函数接口
下一篇: UEFI.源码分析.DXE的异步事件服务.第一部分.事件驱动
木艮氵
博客等级 码龄11年 136粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值