- 博客(28)
- 收藏
- 关注
原创 PE文件格式
据说UEFI是参考了Windows去设计的,在UEFI中可以看到许多Windows的影子。其中UEFI程序采用的文件格式就是Windows环境下的PE格式。
2025-09-26 18:42:54
373
原创 DebugAgent处理流程
Debug Agent中断处理流程 Debug Agent处理CPU中断时,不同中断向量采取不同流程: 对于IDT_3(CpuBreakpoint_Int3)中断:先通知主机,再等待主机命令 对于IDT_32(APIC timer)中断:直接等待主机命令 收到单步执行命令时,会触发IDT_1单步中断 处理入口由汇编实现(AsmFuncs.nasm),包含21个中断处理函数。所有中断最终都会跳转到C语言函数InterruptProcess进行统一处理。汇编代码中通过AGENT_HANDLER_SIGNATUR
2025-09-15 16:20:25
698
原创 010SecMain_InitializeDebugAgentPhase2
DEBUG Agent初始化第二阶段摘要 DEBUG Agent进入初始化第二阶段,主要完成以下关键操作: 更新Mailbox信息和DebugPortHandle 触发软件中断通知HOST端 启用Debug APIC timer中断 开启CPU中断 核心流程包括: 通过TriggerSoftInterrupt()发送SYSTEM_RESET_SIGNATURE信号 在PEI阶段处理内存过滤逻辑 调用SaveAndSetDebugTimerInterrupt()启用定时器中断 使用EnableInterrup
2025-09-15 16:18:15
327
原创 009SecMain_InitializeDebugAgent
摘要: InitializeDebugAgent函数用于初始化调试代理环境,支持SEC和PEI阶段的源码级调试。根据InitFlag参数决定初始化流程:在内存就绪前(DEBUG_AGENT_INIT_PREMEM_SEC)会覆盖IDT表、初始化调试端口并设置缓存中的调试邮箱;内存就绪后(DEBUG_AGENT_INIT_POSTMEM_SEC)则通过HOB复制邮箱数据。函数通过SaveAndDisableInterrupts禁用CPU中断并保存状态,随后初始化调试定时器、端口等硬件。若传入回调函数Funct
2025-09-15 16:14:18
1000
原创 008SecMain_SecCoreStartupWithStack
本文介绍了SecCoreStartupWithStack函数的初始化过程,主要包括以下内容: 为存储解压服务信息预留内存buffer(0x807000-0x807FFF),用于存放GUID和解压函数信息。 IDT初始化: 分配34个8字节门描述符buffer 按照mIdtEntryTemplate模板初始化每个描述符 通过AsmWriteIdtr将IDT信息加载到idt寄存器 其他初始化操作: 调用ProcessLibraryConstructorList初始化构造函数 初始化浮点运算单元 屏蔽8259中断
2025-09-10 15:46:19
766
原创 MTRR技术
摘要: MTRR(内存类型范围寄存器)是x86 CPU提供的硬件机制,用于为不同物理内存区域定义缓存策略,解决设备内存与系统内存的缓存需求差异。通过MTRRphysBase/Mask寄存器对设置特定范围的缓存类型(如WB、WC、UC等),并由IA32_MTRR_DEF_TYPE启用全局功能。其核心应用是为显卡帧缓冲区配置Write-Combining(WC)策略,提升图形性能。MTRR的局限性(数量少、粒度粗)促使引入PAT(页属性表),后者以4KB页面为单位精细控制缓存类型。现代系统中,MTRR与PAT协
2025-09-10 15:40:06
715
原创 APIC中断控制器
摘要: 8259A PIC是早期x86单核系统的中断控制器,支持8-64个中断源,通过优先级和屏蔽机制管理外设中断,但无法满足多核需求。APIC(高级可编程中断控制器)采用分布式设计,由集成在每个CPU核心的Local APIC和芯片组中的I/O APIC组成,支持多核中断路由、动态优先级和处理器间通信(IPI)。Local APIC处理核心本地中断(如定时器)和IPI,而I/O APIC管理外部设备中断并实现负载均衡。APIC演进至x2APIC后,通过MSR访问提升性能,支撑现代多核系统。其协同工作流程(
2025-09-10 15:39:28
1124
原创 APIC中断控制器
摘要: 8259A PIC是早期x86单核系统的中断控制器,支持8-64个中断源,通过优先级和屏蔽机制管理外设中断,但无法满足多核需求。APIC(高级可编程中断控制器)采用分布式设计,由集成在每个CPU核心的Local APIC和芯片组中的I/O APIC组成,支持多核中断路由、动态优先级和处理器间通信(IPI)。Local APIC处理核心本地中断(如定时器)和IPI,而I/O APIC管理外部设备中断并实现负载均衡。APIC演进至x2APIC后,通过MSR访问提升性能,支撑现代多核系统。其协同工作流程(
2025-09-10 13:53:49
1235
原创 CPUID
CPUID是x86架构中用于查询处理器信息的指令,通过EAX寄存器设置功能号来获取不同硬件信息。功能号分为基本功能(0x0-0x7FFFFFFF)和扩展功能(0x80000000及以上),可查询处理器型号、指令集支持、缓存配置等关键信息。常见功能包括:EAX=0x0获取制造商ID,EAX=0x1查询处理器特征标志,EAX=0x80000002-4获取处理器名称字符串。CPUID广泛应用于软件兼容性检测、系统优化和硬件信息展示等场景。
2025-09-09 16:57:09
1117
原创 中断和异常
计算机体系中的中断和异常是两种关键的事件处理机制。中断由外部设备异步触发(如键盘输入、网卡数据),用于提高CPU利用率;异常由CPU指令同步引发(如系统调用、内存错误),用于错误处理和内核服务。核心区别在于:中断是外部异步事件且可屏蔽,异常是内部同步事件且不可屏蔽。二者都通过中断描述符表(IDT)定位处理程序,但中断保持程序上下文完整,而异常可能改变执行流程(重试指令或终止程序)。理解它们的差异对操作系统开发和程序调试至关重要。
2025-09-06 19:06:52
843
原创 007SecMain_ASM_PFX(_ModuleEntryPoint)
这段汇编代码展示了EDK2固件中SecMain模块的入口点_ModuleEntryPoint的实现。代码主要完成以下功能:1) 初始化临时内存区域,用固定值填充;2) 设置临时栈空间,将栈顶地址存入ESP寄存器;3) 准备参数并调用SecCoreStartupWithStack函数,传递栈底地址和Boot Firmware Volume指针。整个过程为后续固件执行建立了基本的内存环境,其中栈空间布局依次包含返回地址、BFV指针和栈底地址。这段代码体现了x86架构下固件初始化的典型模式,通过汇编指令直接操作关
2025-08-31 15:08:01
519
原创 栈的基本概念介绍
层面栈的角色关键点数据结构一种抽象的线性表LIFO原则,Push/Pop操作,数组/链表实现算法应用解决问题的工具函数调用、表达式求值、括号匹配、回溯算法系统内存内存布局的一部分存储局部变量、函数调用上下文,自动管理硬件底层CPU直接支持的功能栈指针寄存器,中断处理,程序执行的基础总而言之,栈是计算机科学中一个极其基础且强大的概念,它从最底层的硬件设计到顶层的应用开发无处不在,是理解程序如何运行的关键之一。
2025-08-31 14:54:42
581
原创 x86CPU寄存器
CPU寄存器是处理器内部的高速存储单元,用于临时存放数据、地址和指令,其速度远超内存但容量有限。X86架构的通用寄存器随处理器代际演进:16位时代(8086)有8个可拆分的寄存器;32位(IA-32)扩展为32位并兼容16位;64位(x86-64)增至16个64位寄存器,同时向下兼容32/16/8位模式,并引入新的调用约定和寄存器保存规则。寄存器的设计演进体现了性能提升与兼容性并重的理念。
2025-08-30 18:34:45
989
原创 006ResetVector_Flat32SearchForSecEntryPoint
摘要:Flat32SearchForSecEntryPoint函数分析 该函数用于在UEFI固件中定位SEC核心(Security Core)的入口点。主要工作流程如下: 从引导固件卷(BFV)开始搜索 检查8字节对齐的FFS文件头 验证文件类型是否为安全核心(EFI_FV_FILETYPE_SECURITY_CORE) 找到SEC核心后,解析PE32/TE格式的可执行文件 计算并返回入口点地址 关键点: 使用PE文件格式解析技术定位入口点 处理PE32和TE两种可执行格式 若查找失败会进入死循环(POST
2025-08-30 08:54:19
637
原创 PE文件格式
UEFI借鉴了Windows的设计理念,使用Windows的PE文件格式作为其程序文件格式。PE文件结构包含DOS头(含关键字段e_magic和e_lfanew)、PE签名(标识PE格式)以及NT头(包含COFF文件头和可选头)。COFF文件头定义了CPU架构、节区数量等基础属性,而可选头则包含代码大小、入口点地址等运行时关键信息。这种结构设计体现了UEFI与Windows系统的深度兼容性。
2025-08-29 14:49:34
469
原创 WinDbg调试应用程序
本文介绍了WinDbg调试带参数程序的方法和常用命令。主要内容包括:1) 启动调试时附带程序参数;2) 常用调试命令如符号路径配置(.sympath)、日志记录(.logopen)、调用栈显示(k)、单步调试(t/p/gu);3) 模块管理(lm)和函数查询(x);4) 断点设置(bp/bu/bm/ba)和管理(bl/bc);5) 内存(d)、IO空间(ib)和寄存器(r)读取操作。文章还提供了相关参考链接,适合作为WinDbg调试的快速参考手册。
2025-08-29 14:04:37
598
原创 VSCode中调试python脚本
本文介绍了如何在VSCode中配置Python调试环境,适用于EDK2构建脚本的调试。主要内容包括:安装Python和Pylance插件;配置launch.json文件,设置调试参数和脚本参数;添加断点的方法;以及启动调试时遇到"ModuleNotFoundError"错误的解决方法(需先执行edksetup.bat初始化环境)。调试配置示例针对EDK2的build.py脚本,包含了详细的构建参数设置。
2025-08-29 09:40:14
562
原创 UefiFirmware生成的过程
UEFI固件生成流程主要分为三个阶段:首先将源码编译为EFI文件,然后打包成FFS文件并组合成FV固件卷,最后整合所有FV生成最终的FD固件镜像。该过程通过Python脚本(如build.py、GenFds.py等)和专用工具链(GenFw、GenSec、GenFfs、GenFv)实现自动化。在EFI文件生成阶段,编译器(如cl.exe/gcc)将源代码编译为目标文件,并处理依赖关系。每个模块的Makefile详细描述了编译步骤,包括生成AutoGen文件和处理特定功能模块(如Fat、ReadWrite等)
2025-08-25 21:02:42
1105
原创 005ResetVector_Flat32SearchForBfvBase
该函数Flat32SearchForBfvBase用于在32位模式下查找Boot Firmware Volume(BFV)的起始地址。主要采用从高地址(0xFFFFF000)向低地址每4KB遍历的方式,通过比对文件系统GUID(FFS2/FFS3)来定位BFV。若找到匹配的GUID,则进一步验证FV长度是否合法。若遍历16MB空间仍未找到,则报错挂起;若成功找到,则将BFV地址存入EBP寄存器。该过程涉及对FV文件头结构的解析,包括ZeroVector和GUID字段的检查。
2025-08-25 20:55:41
1175
原创 004ResetVector_TransitionFromReal16To32BitFlat
这段汇编代码展示了从16位实模式切换到32位保护模式的完整过程。关键步骤包括:1) 关闭中断(cli);2) 加载全局描述符表(GDT);3) 设置控制寄存器CR0进入保护模式;4) 远跳转切换到32位代码段;5) 设置CR4并更新所有段寄存器。代码还定义了GDT结构,包含空描述符、32位代码/数据段、16位代码/数据段和64位代码段等选择子。
2025-08-25 19:58:46
1068
原创 003ResetVector_EarlyInit16
摘要 这段16位初始化代码(EarlyInit16)主要负责调试功能的初始化工作。代码通过将EAX寄存器的值(BIST自检结果)移动到ESP寄存器来设置初始状态,然后调用debugInitialize进行调试系统初始化。该过程会修改EAX寄存器内容,完成初始化后通过OneTimeCallRet返回。具体调试实现可参考相关串口调试文档。
2025-08-25 19:57:07
214
原创 002ResetVector_Main16
摘要:ResetVector.inf中的Main16函数是系统初始化的关键部分,主要完成:1) 通过EarlyInit16初始化调试端口;2) 从16位实模式切换到32位平坦模式;3) 定位Boot Firmware Volume基地址和SEC入口点;4) 跳转到SEC阶段执行。由于早期不支持call指令,OVMF使用OneTimeCall宏通过jmp实现函数调用,相关宏定义在CommonMacros.inc中。该过程完成处理器模式转换和固件初始化的关键步骤。(150字)
2025-08-25 19:51:09
306
原创 001ResetVector_EarlyBspInitReal16
摘要:EarlyBspInitReal16是UEFI CPU包中的一个16位汇编函数,位于Init16.asm文件。该函数通过将字符"BP"存入DI寄存器,标记当前CPU核为引导处理器(BSP),随后跳转至Main16继续执行。该操作主要用于多核处理器环境下的BSP标识初始化。
2025-08-22 21:53:13
213
原创 配置串口调试
本文介绍了通过串口输出调试信息的方法。在OVMF平台中,可以通过定义DEBUG_SERIAL宏来启用串口调试功能。文章详细说明了如何配置初始化串口函数debugInitialize,包括设置数据格式和波特率等关键步骤。通过修改代码将debugInitialize放在EarlyBspInitReal16处,可以实现在CPU执行指令后立即初始化串口。文中还提供了具体的代码示例和串口输出结果,展示了如何通过debugShowCharacter函数输出调试信息到串口。
2025-08-22 21:03:25
518
原创 000ResetVector_resetVector
x86架构处理器上电/重启后会跳转到0xFFFFFFF0(Reset Vector)执行指令。OVMF平台的ResetVector代码中包含两个NOP指令和一个跳转指令:第一个NOP用于多核处理器中确定BSP(主处理器),第二个NOP用于对齐,随后跳转到EarlyBspInitReal16。分析编译后的二进制文件ResetVector.bin(90 90 E9 5B FF)和反汇编列表ResetVector.lst,确认该代码正确生成。Intel手册说明,在多核系统中,第一个成功执行NOP指令的处理器将被选
2025-08-21 13:58:02
1143
原创 QEMU+OVMF搭建源码调试环境
本文介绍了在Windows环境下使用WinDbg调试OVMF固件的完整流程。首先需要安装WinDbg、Tera Term、QEMU和UDKDT工具,并配置调试端口为TCP,服务器为localhost,端口20716。然后提供了编译OVMF固件的脚本,支持SECURE_BOOT、NETWORK等特性调试。最后给出QEMU启动脚本,通过Tera Term连接监视器和控制台,使用UDKDT启动WinDbg调试器,并配置了虚拟机的共享文件夹。文中所有路径均需按实际情况修改。
2025-08-19 09:27:39
532
2
原创 Git简介
本文介绍了Git的基本配置和操作指南。主要内容包括: Git配置:系统/全局/局部三种配置方式,用户名邮箱设置,换行符转换及命令别名设置。 基本概念:本地/远程仓库结构、分支关系及HEAD指针作用。 核心操作: 仓库创建(init/clone) 状态检查(status) 代码提交(add/commit) 版本回退(reset/restore) 远程同步(pull/push) 分支管理:本地分支创建、远程仓库关联等。 辅助功能:日志查看、文件追踪控制等。 文中通过具体命令示例说明各功能用法,适合开发者快速掌握
2025-08-18 15:18:30
656
原创 搭建EDK2开发环境
本文介绍了EDK2开发环境的搭建步骤:首先下载EDK2源码并更新子模块;然后配置构建环境,包括安装Visual Studio、NASM、ASL和Python等工具;接着编译BaseTools并初始化构建环境;最后通过修改配置文件和使用build命令来构建平台或特定模块。文末提供了EDK2官方入门指南作为参考。
2025-08-18 09:15:50
609
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅