
固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载本文围绕 coreboot 仓库中 Documentation/northbridge/intel/sandybridge/index.md 及其子文档系统讲解 Intel 第二代Sandy Bridge与第三代Ivy Bridge酷睿处理器内存控制器北桥的初始化原理、原生内存初始化Native RAM Initialization的实现细节、频率选择策略、读取训练算法、MCHBAR 寄存器布局以及如何通过 me_cleaner 缩减 Intel ME 固件以回收 Flash 空间。读完本文你将掌握 coreboot 在 Sandy/Ivy Bridge 平台上如何不依赖闭源 mrc.bin 完成内存初始化的完整技术脉络并能落地配置USE_NATIVE_RAMINIT、XMP/熔丝覆盖、MRC cache 复用、S3 恢复与 ME 分区裁剪等实战操作。一、章节导航与文档总览Documentation/northbridge/intel/sandybridge/index.md是 coreboot 中关于 Intel Sandy Bridge 北桥的官方文档入口其目录树指向三份核心文档Native RAM Initializationnri.mdRAM initialization feature matrixnri_features.mdME Cleanerme_cleaner.md其中nri.md又通过 toctree 展开四份深度子文档寄存器文档nri_registers.md、频率选择nri_freq.md、读取训练nri_read.md。这些文档构成了 coreboot 在 Sandy/Ivy Bridge 平台上开源内存初始化的第一手技术资料。需要特别强调的是这套文档的撰写背景是Intel 的内存控制器属于闭源硬件coreboot 社区通过逆向工程梳理出了可编程寄存器与训练算法并在 src/northbridge/intel/sandybridge 下实现了完整的开源 raminit 代码核心文件为raminit.c、raminit_native.c、raminit_common.c、raminit_iosav.c。二、内存初始化的职责范围在 Sandy Bridge / Ivy Bridge 上内存初始化代码必须承担大量工作见nri.md主要包括选择工作频率Operating frequency选择公共时序Common timings施加频率相关的补偿值对所有已插 DIMM 的通道执行读取训练Read training对所有已插 DIMM 的通道执行写入训练Write training调整地址与命令信号的延迟网络对所有已插 DIMM 的通道执行 DQS 训练编程内存映射Memory map上报 DRAM 配置错误处理这些职责与源码结构一一对应raminit.c中的init_dram_ddr3()src/northbridge/intel/sandybridge/raminit.c是训练总入口内部依次完成 SPD 探测、频率/CAS 选择、通道训练、ECC scrub、正常模式切换与report_memory_config()上报。2.1 符号定义约定nri.md与nri_freq.md、nri_read.md共用一套术语表理解后续内容前必须先掌握符号含义单位有效范围SCKDRAM 系统时钟周期时间s—tCKDRAM 系统时钟周期时间定点表示1/256 ns—DCK数据时钟周期时间两个 SCK 沿之间的时间s—timAIO 相位IO 信号的相位延迟1/64 DCK[0-512)SPD每条 DIMM 上 EEPROM 中厂商预置的时序bytes—REFCK参考时钟100 或 133MHz100, 133MULTDRAM PLL 倍频器—[3-12]XMP极限内存配置文件Extreme Memory Profiles——在读取训练章节还会引入 DQSData Strobe用于采样各 lane DQ 信号的数据选通信号。三、Native Raminit 与 mrc.bin 两条路线nri_features.md开篇对比了内存初始化的两条可选路线这在 Kconfig 中对应USE_NATIVE_RAMINIT开关src/northbridge/intel/sandybridge/Kconfig路线一Native raminit开源完全开源代码就在src/northbridge/intel/sandybridge/raminit_native.c等文件中对大多数板卡的大多数频率都能工作但仍可能存在需要修复的错误对在 romstage 中的位置没有要求。路线二mrc.bin raminit闭源 blob使用 Intel System Agent 二进制默认路径3rdparty/blobs/northbridge/intel/sandybridge/systemagent-r6.bin见MRC_FILE配置src/northbridge/intel/sandybridge/Kconfig没有已知错误但必须被放置在 romstage 中的固定偏移处raminit_mrc.c负责该路径。USE_NATIVE_RAMINIT默认值为y即 coreboot 默认推荐使用开源实现。选择 mrc.bin 路径时DCACHE_RAM_MRC_VAR_SIZE默认变为0x9000用于给 MRC 预留变量空间。3.1 已实现功能矩阵nri_features.md给出了一份非常详尽的特性矩阵这里完整转述并补充 Kconfig 佐证通道与容量单通道与双通道支持、已实现、可用最多 4 个插槽支持、已实现、可用每通道最多 4 个 rank支持、已实现、可用。从源码看通道数、每通道槽位数的探测来自CAPID0_A寄存器src/northbridge/intel/sandybridge/raminit.c 中的nb_slots_per_channel()与nb_number_of_channels()。支持频率DDR3-1066533 MHz支持、已实现、可用DDR3-1600800 MHz支持、已实现、可用DDR3-1866933 MHz支持、已实现、可用DDR3-21331066 MHz支持、已实现、可用DDR3-1400700 MHz、DDR3-1800900 MHz、DDR3-20001000 MHz、DDR3-22001100 MHz、DDR3-24001200 MHzIvy Bridge 独占自 coreboot 4.6 起支持、已实现、可用。支持 CAS 延迟CLCL6、CL7、CL8、CL9支持且已实现可用性存疑矩阵中标为?CL10、CL11支持、已实现、可用CL12、CL13、CL14、CL15自 coreboot 4.6 起支持且已实现CL13 标记为可用其余标?。MRC cache上次训练的时序缓存S3 恢复支持、已实现、可用正常启动支持、已实现、可用CRC16 差异时重置。XMP 支持XMP Profile 1支持、已实现、可用仅 1.5V 电压配置档XMP Profile 2支持、已实现但未激活not activated。ECC 支持ECC自 coreboot 4.13 起支持、已实现、可用对应 Kconfig 的RAMINIT_ENABLE_ECCsrc/northbridge/intel/sandybridge/Kconfig。四、频率选择机制nri_freq.md详细描述了频率选择的全过程这是内存初始化中最先确定、影响全局的决策。4.1 SPD 与 XMP每条 DIMM 的 SPDSerial Presence Detect由厂商出厂烧录了多种时序其中之一规定该 DIMM 的最大工作时钟频率以定点值 tCK 存储并被向下取整到最接近的支持频率。部分 SPD 还包含可选的 XMP 数据宣告更高频率的性能模式。XMP 生效条件当前 raminit 能解析 XMP Profile 1 与 Profile 2但只有XMP Profile 1在同时满足以下条件时才会被采用宣告 1.5V 工作电压通道内已安装 DIMM 数不超过 XMP 编码的限制。否则回退到常规 SPD 时序。源码dram_find_spds_ddr3()中依次判断 XMP profile 有效性、dimms_per_channel限制与电压src/northbridge/intel/sandybridge/raminit.c条件不满足时调用spd_decode_ddr3()回落。对应的 Kconfig 覆盖选项NATIVE_RAMINIT_IGNORE_XMP_MAX_DIMMS自 coreboot 4.7 起忽略 XMP 对每通道最大 DIMM 数的限制允许每通道插两根 DIMM 即使 XMP 不允许NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE允许使用请求 1.65V 的 XMP 配置而不是回退到非 XMP 设置源码 249-258 行验证了该分支。注意NATIVE_RAMINIT_IGNORE_XMP_REQUESTED_VOLTAGE在仓库中同样存在因为原生 raminit 目前只支持 1.5V 操作。Kconfig 帮助文本明确指出这些是超频选项请小心处理src/northbridge/intel/sandybridge/Kconfig。4.2 软熔丝Soft fuses板卡制造商会在芯片中编程软熔丝指示其支持的最大 DRAM 频率。但这类熔丝并不构成硬件限制因此被称为软熔丝——可以被忽略Sandy Bridge 读取CAPID0_A的 DMFC 位低 3 位Ivy Bridge 读取CAPID0_B的 DMFC 位(reg32 4) 0x7。源码get_mem_min_tck()src/northbridge/intel/sandybridge/raminit_native.c完整实现了这一逻辑根据 CPU 基址修订BASE_REV_SNB选择寄存器并按位段映射到TCK_533MHZ~TCK_1333MHZ。Ivy Bridge 的映射表明显更长与特性矩阵中 Ivy Bridge 支持更多频率一致。coreboot 默认遵守该上限除非开启CONFIG_NATIVE_RAMINIT_IGNORE_MAX_MEM_FUSES自 coreboot 4.7 起支持。想要让内存跑在 DIMM 的标称频率上的超频用户需要启用它。忽略熔丝可能导致系统不稳定4.3 硬熔丝Hard fuses硬熔丝由 Intel 编程限制给定 CPU/板卡/芯片组可用的最大频率。当前没有寄存器可在设置频率前读取该限制——内存 PLL 无法锁定即表示所选倍频不可用此时 coreboot 会逐级尝试下一个更小的倍频直到 PLL 锁定。4.4 Devicetree 覆盖devicetree 寄存器max_mem_clock_mhz用于覆盖板卡制造商的软熔丝设置可强制一个最小工作频率。它在芯片配置结构体中定义src/northbridge/intel/sandybridge/chip.h例如 666 表示 DDR3-1333、800 表示 DDR3-1600。get_mem_min_tck()中cfg-max_mem_clock_mhz非零时优先返回对应的 tCK。4.5 参考时钟与倍频Sandy Bridge 支持 133 MHz 参考时钟REFCKIvy Bridge 额外支持 100 MHz。参考时钟与 DRAM 倍频按以下公式决定 DRAM 频率REFCK * MULT 1 / DCK注意Ivy Bridge 的 100 MHz REFCK 自 coreboot 4.6 起支持。源码在find_cas_tck()中通过CAPID0_B的PLL_REF100_CFG位(reg32 21) 0x7探测 100 MHz 参考时钟支持并在normalize_tclk()中处理不支持的频率回落src/northbridge/intel/sandybridge/raminit_native.c。Sandy Bridge 支持频率表SCK × MULT × 133 MHz REFCKSCK [MHz]DDR [MHz]倍频 MULT参考时钟 REFCK400DDR3-8003133 MHz533DDR3-10664133 MHz666DDR3-13335133 MHz800DDR3-16006133 MHz933DDR3-18667133 MHz1066DDR3-21338133 MHzIvy Bridge 支持频率表额外支持 100 MHz REFCK 档位自 coreboot 4.6 起SCK [MHz]DDR [MHz]倍频 MULT参考时钟 REFCK400DDR3-8003133 MHz533DDR3-10664133 MHz666DDR3-13335133 MHz800DDR3-16006133 MHz933DDR3-18667133 MHz1066DDR3-21338133 MHz700DDR3-14007100 MHz800DDR3-16008100 MHz900DDR3-18009100 MHz1000DDR3-200010100 MHz1100DDR3-220011100 MHz1200DDR3-240012100 MHz4.6 倍频选择算法nri_freq.md给出了 coreboot 选择最大工作频率的伪代码if devicetrees max_mem_clock_mhz 0: freq_max : max_mem_clock_mhz else: freq_max : soft_fuse_max_mhz for i in SPDs: freq_max : MIN(freq_max, ddr_spd_max_mhz[i])可见当插入不同最大频率的 DIMM 时取最慢 DIMM 的频率以避免对其超频。选定频率后得到 PLL 倍频若 PLL 锁定见硬熔丝一节则该频率用于所有 DIMM此后直到断电都无法再更改倍频若 PLL 不锁定则逐级使用更小的倍频直到找到可用的。五、读取训练Read Training算法nri_read.md深入解释了读取训练序列其目的是补偿 DQS 与 SCK 之间的 skew偏移并找到最小可用的往返延迟roundtrip delay。5.1 背景Fly-By 拓扑每块板卡的布线拓扑都不同且可搭配任意的 DDR3 内存模块组合这会在内存 lane 之间引入不同 skew。DDR3 引入的 Fly-By 布线拓扑构成了 DQS-SCK skew 的最大来源。内存代码需要实测 skew 并激活延迟门delay gates来补偿skew。读取训练时DRAM 与控制器进入特殊模式每次读指令后DRAM 输出预定义模式控制器在给定延迟后采样 DQS。由于模式已知每条 lane 的实际延迟即可被测量。读取训练编程的值只影响 DRAM 到内存控制器方向的数据传输5.2 硬件延迟能力硬件包含两类延迟逻辑块可将某 lane/rank 的 DQ/DQS 延迟一个或多个时钟周期的块即 IO delay可按每个 lane 以 1/64 DCK 为粒度延迟信号的块即 IO phase。所有延迟值都通过写 MCHBAR 中的寄存器由软件控制。IO phase可在[0-512) * 1/64 DCK范围内调节。将其递增 64 等价于 IO delay 递增 1。IO delay将 DQ/DQS 信号延迟一个或多个时钟周期。往返时间Roundtrip time内存控制器发出读命令后等待数据返回的时间。由于时钟域交叉、多个延迟实例与相位插值器信号往返内存控制器的默认时间为 55 DCKs。真实往返时间必须实测发出读命令后计数器递减到零才激活输入缓冲。5.3 训练算法步骤算法需要同时确定三个参数roundtrip time、IO delay、IO phase。同步到数据相位Synchronize to data phase第一次测量对相位[0-64) * 1/64 DCK采样所有 DQS 值搜索低数据符号low data symbol的中点把 timA 调整到该相位使后续测量与低数据符号对齐。代码假设初始 roundtrip time 使测量落在交替模式的数据相位中。定位前导Finding the preamble与交替模式010101...的数据相位不同前导由两个高数据周期组成。代码在保持 timA 不动的情况下递减 IO delay/RTT 并采样 DQS读到 low 说明还在数据相位读到 high 即找到前导。roundtrip time 与 IO delay 持续调整直到所有 lane 对齐。下图展示了 roundtrip time 为 49 DCKs、IO delay蓝点处为 6 DCKs 时 lane 0-3 的 timA 分布。注意采样数据已按 timA 平移前导此时与相位对齐。精细调整Fine adjustment由于 timA 仍指向数据符号中点需加上偏移 32使其指向前导的下降沿。为减小抖动引入的误差相位从timA - 25扫描到timA 25每个点采样 DQS 100 次找出每个上升沿实为前导下降沿的中点作为最终 IO phase。结果如图所示lane 0-2 会被调整 -10 相位而 lane 3 本身已经正确。nri_read.md还附了三张不同 roundtrip 值55、54、53 DCKs下的 timA 采样图直观展示了信号中的抖动——每次采样发生在不同的循环迭代中且结果寄存器每个 lane 只有一个位在源码侧训练序列的硬件执行依赖 IOSAVI/O Subsequence and Validation机制raminit_iosav.c中iosav_write_sequence()将 MRS、PRE、ACT、RD、WR、ZQCS 等命令子序列编程进 IOSAV 寄存器组并触发执行src/northbridge/intel/sandybridge/raminit_iosav.c训练结果则通过文档描述的 lane training result 寄存器读回。六、MCHBAR 寄存器非官方文档nri_registers.md是社区逆向出来的 MCHBAR 寄存器空间非官方文档文档自己声明不完整且可能有错请谨慎对待。MCHBAR 通过 PCI(0:0:0) 设备的寄存器 0x48 启用。6.1 寄存器编址规律文档按通道 0 × lane 0-7组织每个 lane 有三类寄存器呈现清晰的偏移规律Lane training result 寄存器64 位如MCHBAR 0x4、0x204、0x404...间隔 0x200位 0-63每一位对应 64 个 IO delay 设置之一的训练结果Read delay settings 寄存器32 位Rank 0-3 各一如MCHBAR 0x10/0x14/0x18/0x1c包含 IO phase、DQS 上升沿相位、IO delay、DQS 下降沿相位Write delay settings 寄存器24 位Rank 0-3 各一如MCHBAR 0x20/0x24/0x28/0x2c包含 DQ IO phase、DQS IO phase、DQS IO delay、DQ IO delay。以MCHBAR 0x10Channel 0、lane 0、Rank 0 的读延迟设置寄存器为例位段描述0:5IO phase shift单位 1/64 DCK6:11DQS phase shift on rising edge单位 1/64 DCK16:18IO delay单位 DCK20:25DQS phase shift on falling edge单位 1/64 DCK写延迟寄存器如MCHBAR 0x20布局如下位段描述0:5DQ IO phase shift单位 1/64 DCK8:13DQS IO phase shift单位 1/64 DCK15:17DQS IO phase shift单位 DCK20DQ IO phase shift单位 DCK6.2 特殊寄存器摘要除逐 lane 的延迟寄存器外文档还记录了以下关键全局寄存器均在 Channel 0 语境下MCHBAR 0x1810COMP1 RegisterODT位 9-11、CLK drive up位 21-23、CTRL drive up位 27-29MCHBAR 0x320cCommand crossover enable RegisterCLK phase low位 0-5、CLK phase high位 12、Enable hardware位 14、Enable on slot 1/2位 17/27MCHBAR 0x4000TC_DBPtRCD、tRP、CAS、CWL、tRAS 各 4 位MCHBAR 0x4004TC_RAPtRRD、tRTP、CKE、WTR、tFAW、tWR以及 Command 3-state options位 29与 CMD stretch位 30-3100b1N、10b2N、11b3NMCHBAR 0x400cOTHP ODT controltXPDLL、tXP、ODT stretch 等MCHBAR 0x4024Roundtrip time RegisterRTT Rank 0/1 DIMM 0/1 各 8 位MCHBAR 0x4028SC_IO_LATENCYIO latency 与 roundtrip - I/O compensationMCHBAR 0x4200~0x423cRAM training queue地址、命令 IO!RAS/!CAS/!WE、cooldown命令后等待的时钟周期数0x4284为执行队列的启动寄存器MCHBAR 0x4298/0x4e98TC Refresh parameterstREFI位 0-15、tRFC位 16-24、tREFIx9位 25-32应编程为8.9 * tREFI / 1024MCHBAR 0x42a4SRFTPtXSDLL、tXS_offset、tZQOPER、tMODMCHBAR 0x4cb0PM Power-down configPDWN_idle_counter位 0-7最小应大于等于最差往返时间加突发长度、PDWN_mode位 8-100x0No power down、0x1APD、0x2PPD、0x3APDPPD、0x6PPD-DLLoff、0x7APDPPDDLLoffMCHBAR 0x4e94TC Refresh parametersOREF_RI、Refresh_HP_WM、Refresh_panic_WMMCHBAR 0x5000Global channel size controlCH_A位 0-1、CH_B位 2-3、CH_C位 4-5定义最大/中等/最小通道MCHBAR 0x5004Address Decode RegisterDIMMA/DIMMB 容量256 MB 倍数、DAS 槽位映射、rank 数、DRAM 宽度x8/x16、Rank interleave enable、Enhanced interleave enable、High order Rank interleave 与 ECC 使能位 24-2500b无 ECC、01bIO 上 ECC、11bIO 与 ECC 逻辑均开启MCHBAR 0x5030Global DDR3 controlDDR reset位 1、DCLK enable位 2、IO reset位 5MCHBAR 0x5034Version RegisterMRC versionMCHBAR 0x5060PM Self refresh configIdle_timer 与 SR_EnableMCHBAR 0x5e00MC_BIOS_REQ选定的倍频位 0-7100 MHz 时 [7,12]、133 MHz 时 [3,19]、位 8 指示 100 MHz 参考时钟Ivy Bridge 独有、位 31 为 PLL busyMCHBAR 0x5e04MC_BIOS_DATA当前活动倍频MCHBAR 0x5f08RCOMP controlForce RCOMP位 8。这些寄存器与上文算法一一对应比如读取训练算法最终就是把 IO phase、IO delay、roundtrip time 分别写入Read delay settings与Roundtrip time寄存器训练队列寄存器则承载 IOSAV 命令序列的地址与冷却周期。七、SMBIOS 上报与 dmidecode 验证内存初始化完成后coreboot 通过 SMBIOS type 17 上报内存配置自 coreboot 4.4 起支持。在 GNU/Linux 下运行dmidecode -t 17即可查看Handle 0x0045, DMI type 17, 34 bytes Memory Device Array Handle: 0x0042 Error Information Handle: Not Provided Total Width: 64 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: None Locator: ChannelB-DIMM0 Bank Locator: BANK 2 Type: DDR3 Type Detail: Synchronous Speed: 933 MHz Manufacturer: 0420 Serial Number: 00000000 Asset Tag: 9876543210 Part Number: F3-1866C9-8GSR Rank: 2 Configured Clock Speed: 933 MHz重要解读dmidecode 打印的内存频率是当前活动频率既不是双倍数据率也不是 SPD 中编码的最大频率。例中 DDR3-1866 的Speed显示为 933 MHz即实际工作频率 SCK非标称 1866 MT/s 的双倍速率。对应源码实现位于raminit.c中的report_memory_config()并最终汇入setup_sdram_meminfo()src/northbridge/intel/sandybridge/raminit.c。八、MRC Cache训练结果复用与 S3 支持命名澄清MRC cache这个名字可能造成误导——在 Native RAM init 场景下并没有 MRCMemory Reference Code只是历史原因沿用了这个名称。原理MRC cache 是 Flash 中 coreboot 可写的部分。启动结束时 coreboot 把内存训练结果写入 Flash 以备后续使用因为内存训练非常耗时。存储训练结果有两个收益正常启动时更快跳过重新训练支持 S3 恢复——S3 恢复时 RAM 内容还在但训练结果无法存在 RAM 里因为必须先配置好内存控制器才能访问 RAM。失效机制内存配置改变时必须使 MRC cache 失效。检测方法是对每根 DIMM 计算 CRC16 并存入 MRC cache下次启动比对。源码链路完整印证了文档自 coreboot 4.4 起保存save_timings()调用mrc_cache_stash_data(MRC_TRAINING_DATA, MRC_CACHE_VERSION, ctrl, sizeof(*ctrl))src/northbridge/intel/sandybridge/raminit.c在非 fast boot 的启动末尾执行加载mrc_cache_current_mmap_leak()尝试读取缓存src/northbridge/intel/sandybridge/raminit.c校验缓存读取后先比对 CPUID防止换过 CPU再通过verify_crc16_spds_ddr3()校验 SPD CRC16 是否与当前 DIMM 一致src/northbridge/intel/sandybridge/raminit.cS3 兜底S3 恢复时若无可用缓存直接system_reset()重新冷启动src/northbridge/intel/sandybridge/raminit.c。raminit_mrc.cmrc.bin 路线同样通过save_mrc_data()/prepare_mrc_cache()使用同一套缓存基础设施src/northbridge/intel/sandybridge/raminit_mrc.c。九、错误处理与调试9.1 降级策略目前唯一支持的错误处理方式是禁用失败的通道并重启内存训练序列自 coreboot 4.5 起。因为内存通道彼此独立运行这种降级很可能成功。若没有任何 DIMM 能被初始化coreboot 会调用die()停机——屏幕保持黑屏直到断电。部分平台提供额外的反馈指示。init_dram_ddr3()末尾的实现是首次try_init_dram_ddr3()失败后printram(Disable failing channel.)通过disable_channel(ctrl, GET_ERR_CHANNEL(err))屏蔽失败通道再次尝试若仍失败则die(raminit failed)src/northbridge/intel/sandybridge/raminit.c。诊断技巧如果发现dmidecode -t 17只报告了实际内存容量的一半很可能是发生了致命的初始化失败。项目的基本立场是一块能工作但物理内存更少的板子远比一块根本无法启动的板子要好。9.2 调试与日志尝试对调内存模块或换不同品牌的内存若无效可查阅Debugging章节或在 ticket.coreboot.org 上报工单附上用 EHCI debug 抓取到的完整 RAM init 日志启用 Kconfig 选项DEBUG_RAM_SETUP可获得详尽的内存训练日志该选项由NORTHBRIDGE_INTEL_SANDYBRIDGE自动 select即HAVE_DEBUG_RAM_SETUPsrc/northbridge/intel/sandybridge/Kconfig。调试时建议使用外部调试器串口或 EHCI debug 棒——内存初始化失败时板子可能完全无法启动CBMEM 也就不可用。9.3 Lenovo ThinkPad 专属死亡指示Lenovo ThinkPad 有额外特性来指示RAM init 失败且 coreboot 已死亡die()由此得名。通过 Kconfig 选项自 coreboot 4.7 起H8_BEEP_ON_DEATH蜂鸣提示H8_FLASH_LEDS_ON_DEATH闪烁 LED 提示。对应实现位于 EC 驱动中src/ec/lenovo/h8/Kconfig 与 src/ec/lenovo/h8/panic.cpanic.c中分别处理 LED 闪烁与蜂鸣逻辑。十、ME Cleaner裁剪 Intel ME 固件me_cleaner.md介绍如何在构建流程中清理Flash 中的 ME 分区。清理会尽量多地移除 ME 固件分区中的代码在这种状态下ME 会报错并停止运行。重要警告使用清理过的ME 分区可能引发问题使用前务必仔细评估10.1 已观察到的副作用使用 cleaned ME 后的已知问题包括LPC 总线不稳定SuperIO 功能异常TPM 功能异常高总线活动时系统随机关机。报 Bug 前请务必用未修改的 IFD 和 ME 段测试再向 coreboot 项目报告问题。10.2 缩减 Intel ME 固件体积教程默认情况下清理后的 ME 固件仍会占据与原分区相同的空间。可以修改固件分区布局来回收空间给 coreboot 使用缩减后的 Intel ME 固件让ifd、gbe、me三个区域合计占用不到 128 KiB剩余空间全部留给bios区域。第 1 步获取完整 ROM需要一份包含完整 Intel ME 固件的完整可用 ROM。第 2 步运行 me_cleaner对一个完整 ROM下称fulldump.rom运行 me_cleaner。完整 ROM 应包含IFD、完整可用的 Intel ME、GbE可选、BIOS任意固件。./util/me_cleaner/me_cleaner.py -D patched_desciptor.bin -M stripped_me.bin fulldump.rom -t -r -S生成的产物打补丁的 IFDpatched_desciptor.bin裁剪后的 Intel MEstripped_me.bin打补丁的 IFD 设置了AltMeDisable位并修改了 Flash 布局。me_cleaner 脚本在仓库 util/me_cleaner/me_cleaner.py 中其命令行参数与-D提取描述符、-M提取 ME 镜像、-S软禁用、-r重定位 FTPR 分区、-t截断 ME 分区空余部分一一对应util/me_cleaner/me_cleaner.py。注意coreboot 允许在构建过程中选择CONFIG_ME_CLEANER但它不会重做 Flash 布局只会从 ME 中移除文件并设置 AltMeDisable 位。第 3 步构建 coreboot把上一步生成的两个文件纳入 coreboot 构建系统增大 CBFS 容量8 MiB ROM0x7E000012 MiB ROM0xBE000016 MiB ROM0xFE0000因为已经手动跑过 me_cleaner不要在 Kconfig 中再次启用 me_cleaner。第 4 步刷写 ROM由于修改了布局必须用外部编程器把完整 ROM刷入 Flash刷写教程见 Documentation/tutorial/flashing_firmware/index.md。确保 ROM 包含所有分区IFD、EC可能未用、GbE可能未用、ME、BIOS。十一、结语coreboot 在 Sandy/Ivy Bridge 平台上的技术积累是一份难得的开源固件逆向内存控制器范本从CAPID0_A/B熔丝读取、SPD/XMP 解析、REFCK * MULT频率公式、timA/IO delay 读取训练算法到MCHBAR 0x4一类的寄存器位段描述全部沉淀在 Documentation/northbridge/intel/sandybridge 下的文档中并与 src/northbridge/intel/sandybridge 的源码实现一一呼应。对于希望理解内存训练原理、参与 coreboot 开发或尝试 ME 裁剪的读者这一组文档连同raminit.c、raminit_native.c、raminit_iosav.c、nri_registers.md是最直接的起点。赞分享固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载相关推荐coreboot 移植实战Acer TravelMate P633 系列Sandy Bridge 笔记本构建、刷写与状态全解析coreboot 移植实战Acer TravelMate P633 系列Sandy Bridge 笔记本构建、刷写与状态全解析 本指南以 coreboot固件嵌入式操作系统驱动开发coreboot 实战ASUS P8Z77-MSandy Bridge Panther Point主板移植与刷写指南coreboot 实战ASUS P8Z77 MSandy Bridge Panther Point主板移植与刷写指南 本文以 coreboot 官方文固件嵌入式操作系统驱动开发终极指南如何使用me_cleaner安全清理Intel ME固件终极指南如何使用me_cleaner安全清理Intel ME固件 Intel ME固件安全清理技术是保护设备安全的重要环节而me_cleaner作为一款强大网络安全嵌入式上一篇Kleros Curate 的 MetaEvidence 检索与编写以 onchain 事实源驱动 Token 化审核列表的完整指南下一篇Vuls内存优化案例研究从问题诊断到解决方案实施创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考