- 博客(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:读写磁盘的文件
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:读写当前系统的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 执行平台相关动作
真正的电平/边沿触发由芯片组内部的 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
原创 使用另一个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
原创 DevicePathDxe driver如何安装protocol
其gEfiDevicePathUtilitiesProtocolGuid, gEfiDevicePathToTextProtocolGuid, gEfiDevicePathFromTextProtocolGuid;mDevicePathUtilities, mDevicePathToText, mDevicePathFromText由对应的头文件定义。把上面已经编译好的 efi 文件打包进固件卷。把对应的驱动编译出来。
2025-11-04 11:29:26
316
翻译 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安装PPI和调用其他PPI的相关函数
通过PeiServicesInstallPpi、PeiServicesNotifyPpi、PeiServicesReInstallPpi函数进行安装。
2025-10-21 11:06:44
251
原创 第一次进入 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关注的人
RSS订阅
1