自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 !amli 指令用法

AML是ACPI规范定义的一种语言,用来描述设备的电源管理、热区、中断路由等动态行为Windows 内核加载 DSDT/SSDT 表后,AMLI 解释器逐条解析并执行这些 AML 字节码,完成硬件初始化、电源状态切换、设备枚举等任务。

2025-12-19 10:54:50 292

原创 系统电源状态 - Global System States

调用 _PTS(0x3) → _S3 → _WAK(0x3):调用 _PTS(0x4) → _S4 → _WAK(0x4):所有硬件断电,内存映像写入hiberfil.sys。:CPU断电,内存保持供电,大部分设备关闭。:Windows"睡眠"模式,内存内容保留。:CPU断电,内存保持刷新,部分设备待命。:Windows"休眠"模式,完全断电。:接近零(0.3-1W,仅RTC电路):调用 _PTS(0x5) → _S5。:CPU停止,内存刷新暂停,设备待命。:所有硬件完全断电,无内存映像。

2025-12-18 15:07:23 272

原创 使用USB 3.0数据线通过主机windbg调试测试机

通过“运行”打开msconfig,通过引导选项->高级选项选择调试,使用USB端口,并设置USB目标名然后通过HE工具查看port口的属性,选择可连接,支持debug,支持3.0的port通过命令提示符(管理员权限)进行port配置x.x.x分别是port对应的Host Controller的bus.device.function,如0.20.0配置完成后重启测试机。

2025-12-18 09:08:36 210

原创 编写 UEFI application:读写 EC RAM

EC RAM是嵌入式控制器(Embedded Controller, EC)与系统固件/操作系统共享的内存区域,用于双向通信和状态传递读写 EC RAM需要通过ACPI,在之前的获取ACPI table信息的UEFI_APPLICATION中,得知ACPI的版本是6.2,对应到Acpi62.h文件一般端口0x62为数据寄存器(EC_DATA),支持主机与EC之间的双向数据传输。端口0x66为命令/状态寄存器(EC_SC),读取时返回端口状态信息,写入时生成指令序列发送至EC。

2025-12-09 14:12:36 406

原创 编写 UEFI application:读写 CPU MSR

要读CPU MSR需要知道他的MSR Index,即MSR地址Intel和AMD的MSR地址有所不同,从之前读取CPU ID的文章中可以了解到:OVMF的CPU是模拟的AMD CPU。从AMD的spec:AMD64 Architecture Programmer’s Manual读取EFER进行试验发现对应到寄存器中的数据就是8,10,11位。

2025-12-08 14:34:27 226

原创 编写 UEFI application:读取CPUID

以下代码由Cpuid.c改写得到输出结果:

2025-12-05 16:14:26 127

原创 编写 UEFI application:读写磁盘的文件

LogicalPartition=1:OVMF固件为虚拟盘上的FAT文件系统创建的分区视图。然后打开文件/目录(L"\EFI\Boot"),获取到打开后的目录句柄(DiskFile)首先找到文件系统协议,通过文件系统(DiskFs)寻找根目录(DiskRoot)BY_START/TO_START 与 PRODUCE/CONSUME 的。读写文件需要在 LogicalPartition = 1的逻辑层执行。通过在Open给出创建权限生成之前不存在的文件。在这个目录句柄下通过Read读取文件信息。

2025-12-05 10:00:11 766

原创 OVMF Print 输出

重复前缀,表示重复执行后续指令直到 RCX 寄存器为 0。print 在屏幕上的输出通过把数据写入显存实现。是一条硬件级内存块拷贝指令。移动四字,每次拷贝 8 字节。

2025-12-01 16:27:53 188

原创 编写UEFI application:获取当前系统ACPI table的信息

for。

2025-11-27 14:26:10 234

原创 编写UEFI application:获取当前系统smbios的信息

模块错误会导致无法正确识别。

2025-11-26 09:56:13 320

原创 编写UEFI application:实时读取当前系统时间

【代码】编写UEFI application:实时读取当前系统时间。

2025-11-26 09:50:39 117

原创 编写UEFI application:读写当前系统的variable

位二进制EDK2 宏名称作用说明000000001保留(早期文档曾叫 EFI_VARIABLE_NON_RETAIN,现废弃,必须为 0)100000010非易失:变量存于 Flash / NVRAM,掉电后仍保持;若不设此位,则变量仅存在于易失内存,重启即丢失。200000100启动服务访问:变量在 UEFI Boot Services 阶段可被读写;任何变量至少要设此位或下一位,否则创建失败。300001000运行时访问。

2025-11-25 11:39:27 275

原创 编写UEFI application:获取当前系统所有handle的信息

由于 Handle 不具备名称、类型等信息,这里只去获取 Handle 对应的 Protocol。通过 ProtocolsPerHandle 获取,此函数也在上述参考资料中。首先可以使用以下文章中的 LocateHandleBuffer,通过 gBS 获取到所有Handle。其中除 .c 文件外的其他文件相差不大,着重解释 .c 文件。选择 AllHandles 类型。

2025-11-24 17:15:31 230

原创 EFI Runtime Services Table:gRT

判断平台是否支持通过 UpdateCapsule() 处理指定胶囊,并返回必需的复位标志及最大胶囊尺寸。将 EFI 固件的运行时寻址模式从物理地址切换为虚拟地址。获取当前日期与时间,以及硬件平台的时间保持能力。将胶囊提交给固件,同时附带虚拟和物理映射。确定后续内存访问要使用的新虚拟地址。返回平台单调计数器的高 32 位值。设置当前本地日期与时间。获取当前唤醒闹钟的设置。返回 EFI 变量信息。设置系统唤醒闹钟时间。枚举当前所有变量名称。

2025-11-24 14:31:03 145

原创 EFI Boot Services Table:gBS

池内存(Pool Memory)是一种内存管理技术,把一块提前申请好的内存池划成许多大小相等的小块,程序要用时直接从池里拿一块,用完再还回去。获取安装在某句柄上的所有协议接口 GUID 列表,列表缓冲区由池内存分配。若支持,则代调用者打开该协议。返回支持所请求协议的句柄数组,数组缓冲区由池内存分配。创建一个事件,当指定协议的接口被安装时触发该事件。在设备路径上定位支持指定协议的那个设备句柄。在启动服务环境中安装一个或多个协议接口。返回支持指定协议的所有句柄组成的数组。将一个缓冲区的内容复制到另一个缓冲区。

2025-11-24 11:42:33 461

原创 编写UEFI application:获取当前系统的memory 分配信息

描述符记录了一块内存的信息,根据描述符的版本分为多个大小。将1左移十位对应1KB。

2025-11-21 17:22:12 339

原创 使用UEFI application去调用遍历pcie设备配置空间的DXE driver

提供遍历pcie设备配置空间protocol的DXE driver使用DXE driver去调用。

2025-11-19 11:46:42 167

原创 BdsEntry

OsIndications 是 UEFI 规范中定义的一个机制,用于在操作系统加载程序和固件之间传递特定的引导意图或状态信息。它是一个 64 位的位掩码,每个位代表一个特定的指示,操作系统可以通过设置这些位来通知固件某些特定的行为或需求。第一次启动时,变量不存在,GetVariable 会返回 EFI_NOT_FOUND,此时把 OsIndication 清零。在平台恢复场景下,系统允许“加载选项数量为 0”是合法的,甚至是一种预期状态。在没有平台恢复选项时,创建一个默认的平台恢复选项。

2025-11-14 17:29:59 938

原创 BDS 移交控制权到已加载映像的入口

将该映像链接到链表头部,它是唯一可调用 Exit() 的映像。

2025-11-14 17:29:32 152

原创 BDS 执行平台相关动作

真正的电平/边沿触发由芯片组内部的 PIRQ/INTx→IRQ 映射表决定。-kernel 是一个命令行选项,用于指定一个 内核镜像文件,QEMU 会将其加载到内存中,并将启动权交给它,而不是从虚拟机的硬盘或光驱启动。UEFI Shell 是一个基于 UEFI 标准的命令行工具,它在启动过程中提供了一个交互式环境,允许用户直接与固件和硬件交互。Q35_MCH 就是 Intel Q35 芯片组里的 Memory Controller Hub(MCH),也就是俗称的北桥。有 Flash → 直接用,不恢复。

2025-11-13 17:27:31 670

原创 执行平台初始化 - PlatformBootManagerBeforeConsole

由BdsEnter.c里的PlatformBootManagerBeforeConsole ();执行。

2025-11-12 11:00:08 761

原创 对比:设备路径 vs GUID

【代码】对比:设备路径 vs GUID。

2025-11-11 08:55:45 113

原创 各 DXE Driver 作用

给整个固件提供“构造、解析、打印设备路径”的公共 API。

2025-11-07 16:33:11 983

原创 使用另一个DXE driver去调用遍历pcie设备配置空间的DXE driver

提供遍历pcie设备配置空间protocol的DXE driver。

2025-11-06 10:04:44 274

原创 编写一个DXE driver 提供遍历pcie设备配置空间的protocol

PCIe (Peripheral Component Interconnect Express)设备配置空间是每个 PCIe 设备都具有的一个标准化寄存器集合,用于存储设备的硬件信息、资源需求和功能配置。

2025-11-05 17:02:25 222

原创 DXE 定位协议的三种 API

【代码】DXE 定位协议的三种 API。

2025-11-04 17:09:10 246

原创 DevicePathDxe driver如何安装protocol

其gEfiDevicePathUtilitiesProtocolGuid, gEfiDevicePathToTextProtocolGuid, gEfiDevicePathFromTextProtocolGuid;mDevicePathUtilities, mDevicePathToText, mDevicePathFromText由对应的头文件定义。把上面已经编译好的 efi 文件打包进固件卷。把对应的驱动编译出来。

2025-11-04 11:29:26 316

原创 DXE流程

Index > 1;

2025-11-03 16:38:11 1397

原创 加载 DXE Driver 映像到内存

【代码】加载 DXE Driver 映像到内存。

2025-10-31 16:22:35 171

原创 注册协议通知

【代码】注册协议通知。

2025-10-28 14:27:29 332 1

原创 创建协议注册事件

【代码】创建协议注册事件。

2025-10-28 11:33:50 158

原创 安装映像协议接口

通过GUID寻找协议进入点,如果没有则建一个新的协议进入点。

2025-10-28 10:10:23 330

翻译 RTC/CMOS RAM

包含RTC/CMOS RAM的文档:地址偏移:0Ah默认值:NA(该寄存器不受任何系统复位信号的影响。)属性:读/写该寄存器用于RTC功能的一般配置。地址偏移:0Bh默认值:X0000XXXb属性:读/写该寄存器用于RTC功能的常规配置。地址偏移量:0Ch默认值:00h属性:读/写该寄存器用于各种标志。当R

2025-10-23 10:03:13 23

原创 编写另一个PEIM调用先前PEIM访问CMOS的PPI

除PeiCallCmos.c外其他部分与编写提供访问CMOS PPI的PEIM差异不大。首先要先使PEIM可以调用先前PEIM访问CMOS的PPI。但此时的串口并不能打印,因为安装 ≠ 立即执行。通过定位CallCmosPpi实现调用。着重解析PeiCallCmos.c。实现先定位再调用CMOS PPI。后面需要主动调用一次。

2025-10-22 16:23:57 266

原创 编写一个PEIM提供访问CMOS的PPI

以OvmfPkgIa32X64为例添加PEIM的模块描述文件(.inf)

2025-10-22 09:17:58 250

原创 PEIM安装PPI和调用其他PPI的相关函数

通过PeiServicesInstallPpi、PeiServicesNotifyPpi、PeiServicesReInstallPpi函数进行安装。

2025-10-21 11:06:44 251

原创 第三次进入PEICORE流程

此时内存已经被初始化完成,准备第三次进入。

2025-10-20 17:31:57 299

原创 第二次进入PEICORE流程

PEICORE第一阶段流程。

2025-10-17 17:30:17 362

原创 第一次进入 PEICORE 流程

WinDbg加载符号SEC -> PEI:PeiCore:PEI第一阶段处理PeiServiceTable此时OldCoreData传入的数据为NULL,进入分支此分支把gPs中覆盖到PrivateData.ServiceTableShadow初始化Pei链接库需要重新初始化Debug串口和AcpiTimer初始化内存服务为后续内存服务准备数据并建立最小HOB链表PrivateData->Ps = &(PrivateData->ServiceTableShadow);

2025-10-17 14:34:40 1046

原创 PCD PEIM模块主入口函数流程

PCD PEIM 在大多数开源平台被配置成第一个调度,主要取决于取决于 APRIORI 顺序进入PcdPeimInit把当前PEIM注册为影子通过 PEI Services 表获取 PEI Core 私有实例校验调用者是否为当前正在调度的 PEIM其中CurrentFileHandle 是当前被调用的PEIM句柄设置PEIM状态并返回建立PCD定位外部 PCD去寻找特定类型的Section获取PEI服务表寻找匹配的Section获取FV Handle

2025-10-16 17:03:15 249

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除