H05 —— 内存上电后发生了什么:SPD 芯片和 BIOS 内存 Training
金句:每一根内存条能在电脑上正常使用,是因为在开机的一瞬间,有人在背后做了大量的校准工作。
SPD 芯片:内存的”身份证”
每根内存条上都有一个 SPD(Serial Presence Detect)芯片,EEPROM 存储内存的配置信息。
SPD 芯片的位置和规格:
位置:内存条金手指靠近右侧,通常在缺口(Notch)旁边
封装:8-pin SOIC,3mm × 5mm
容量:256 Bytes(DDR4)或 512 Bytes(DDR5)
SPD 通过 I2C 总线和内存控制器通信:
地址:0x50(Channel 0)、0x51(Channel 1)、0x52(ECC)
总线:I2C(SCL 时钟 + SDA 数据)
速度:400kHz(I2C 快速模式)
主板在 POST(Power-On Self-Test)阶段读取 SPD:
→ BIOS 知道这是什么内存(容量、速度、时序)
→ 自动配置内存控制器
→ 设置正确的频率、电压、时序SPD 存储了什么
SPD 字节分布(DDR4,256 bytes):
Byte 0~1: 厂商标识(0x80 = Samsung, 0xAD = SK Hynix, 0x98 = Micron...)
Byte 2: 颗粒类型(0x0C = 8Gb, 0x10 = 16Gb 等)
Byte 3: 颗粒组织(x4/x8/x16)
Byte 4~5: 容量(0x10 = 8GB, 0x20 = 16GB 等)
Byte 6: ranks(1=单 rank, 2=双 rank)
Byte 7: 排数(1=单面, 2=双面)
Byte 8: 电压(0x06 = 1.2V)
Byte 12~13: JEDEC 标准频率(0x0C = 1600, 0x14 = 2133, 0x18 = 2666...)
Byte 16~17: CL-tRCD-tRP-tRAS 时序(JEDEC)
Byte 20~21: XMP 频率和时序(如果有 XMP)
Byte 22~23: XMP 电压
Byte 118~119:内存条序列号
Byte 122~125:内存条Manufacturing Date
Byte 127: checksum(校验和,检测数据是否损坏)
Linux 读取 SPD 示例:
$ decode-dimms
Manufacturer: Samsung
Part Number: M378A5244BB0-CRC
Size: 8192 MB (2 banks × 2 ranks)
Voltage: 1.2 V
Speed: 2400 MT/s (DDR4-2400)
Timings: CL15-15-15-35BIOS POST 阶段的内存初始化
开机时,BIOS 的内存初始化流程:
BIOS POST 内存初始化流程:
1. 复位和自检
→ CPU 复位,缓存初始化
→ BIOS 开始 POST
2. 内存控制器检测
→ 扫描有多少个内存通道
→ 检测每个通道上有多少个 DIMM 插槽被占用
3. 读取 SPD
→ I2C 总线读取每个 DIMM 的 SPD EEPROM
→ 如果 SPD 读取失败(无内存条或损坏),跳过该通道
4. 选择启动频率
→ 如果有 XMP/EXPO,优先使用 XMP 配置文件
→ 如果没有 XMP,使用 JEDEC 标准频率
→ 如果 XMP 频率不被 CPU/主板支持,降级到 JEDEC
5. 内存 Training(培训)
→ 对每个 DIMM 进行信号校准
→ 设置时序参数
→ 验证内存是否可用(内存测试)
6. 内存测试
→ BIOS 对内存进行简单测试(写入/读出校验)
→ 如果失败,显示错误信息并停机
7. 交控给操作系统
→ 把内存信息写入 ACPI 表
→ 操作系统读取内存信息,建立内存映射内存 Training(培训):信号的精细校准
内存 Training 是 BIOS 里最复杂的一部分——它校准内存信号的时序和电压。
内存 Training 的步骤:
1. 抽屉检测(Slot Detection)
→ 确定哪个插槽有 DIMM,容量是多少
2. 行列地址培训(Address Training)
→ 校准行列地址的采样窗口
→ DDR4 用的是 "Write Leveling" + "Read Gate Training"
→ 确保每个地址信号在正确的时钟沿被采样
3. Write Leveling(写电平校准)
→ 内存控制器发出 CK 时钟
→ DIMM 颗粒把 DQS 信号返回
→ BIOS 调整 DQS 延迟,让 CK 和 DQS 对齐
→ 这是 DDR4/DDR5 高速运行的基础
4. Read Gate Training(读门培训)
→ 校准 Read 操作的 DQS 采样位置
→ 找到数据的"眼图"中心
5. Write DQ Calibration(写 DQ 校准)
→ 校准每个 DQ 引脚的写延迟
→ 确保写入的数据在正确的时刻到达
6. Per-DQS Training(每个 DQS 的精细校准)
→ 对每个 DQS 进行精细调整
→ 最大化眼图Margin(余量)
DDR5 额外的培训:
DFE(Decision Feedback Equalization)Training
→ 校准 DFE 均衡器的参数
→ 允许更高频率(6400+ MT/s)
整个 Training 过程耗时:
- 2~4 个 DIMM:约 200~500ms
- 8~16 个 DIMM(服务器):约 2~5 秒
- 这就是为什么服务器启动比桌面慢为什么内存 Training 这么复杂
内存 Training 的背景:
DDR4/DDR5 的数据速率从 2400 MT/s 发展到 6400 MT/s,
位时间(Bit Time)从 833ps 缩短到 156ps。
位时间越短,对信号完整性的要求越高:
DDR4-2400 的位时间:833 ps
DDR5-6400 的位时间:156 ps
156 ps 里,光只能走 4.7cm
→ 时钟偏差(Clock Skew)、信号串扰、反射都会导致错误
Training 的核心问题:
"数据到达 DQ 引脚的时刻" 是随机的:
- 每根信号线的延迟不同(由于 PCB 走线长度差异)
- 每颗 DRAM 颗粒的输入延迟不同
- 温度变化会影响延迟(温漂)
Training 就是:测量每根线的延迟,然后让控制器在正确的时刻采样
每个 DIMM 的 PCB 走线长度不同:
→ 即使是同一批生产的两根内存条,走线长度也不同
→ 所以每根内存条需要单独 TrainingLinux 下的内存信息查看
查看内存信息的命令:
1. dmidecode(最全):
$ sudo dmidecode --type memory
Handle 0x0025, DMI type 5, 24 bytes
Memory Array Handle: 0x0028
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 16 GB
Form Factor: DIMM
Set: None
Locator: ChannelA-DIMM0
Bank Locator: BANK 0
Type: DDR4
Type Detail: Synchronous
Speed: 3200 MT/s
Manufacturer: Samsung
Part Number: M378A5244BB0-CRC
Rank: 2
Configured Clock Speed: 3200 MT/s
2. cat /proc/meminfo(总内存):
$ cat /proc/meminfo
MemTotal: 32768176 kB(约 32GB)
3. lshw(硬件信息):
$ sudo lshw -short -C memory
4. 读取 SPD(需要 i2c-tools):
$ decode-dimms
$ sudo modprobe eeprom # 加载 SPD 驱动
$ cat /sys/class/i2c-adapter/i2c-0/0-0050/eeprom | xxd | head -20总结
- SPD 芯片:EEPROM,256/512 bytes,存储内存的容量/速度/时序/厂商信息
- I2C 总线:SPD 通过 I2C(0x50/0x51/0x52)和内存控制器通信
- BIOS POST:读取 SPD → 选择频率/电压 → Training → 测试 → 交控 OS
- 内存 Training:Write Leveling / Read Gate Training / DQ Calibration,耗时 200ms~5s
- DDR5 额外培训:DFE Training(支持 6400+ MT/s)
- Training 原因:信号完整性,位时间从 833ps 缩短到 156ps,每根线延迟不同需要校准
H 层总结:H01(Hardware 接口)讲 DIMM 结构/H02 讲双通道/H03 讲时序参数/H04 讲 XMP/EXPO/H05 讲 SPD/Training——硬件层覆盖了内存条从物理连接到 BIOS 初始化的完整过程。
下篇预告(H06):内存条的金手指(Pin)和主板的插槽是怎么连接的?PCB 走线、阻抗控制、以及 DQ/DQS 信号完整性。
关注公众号「AI不着急」,回复”资料”获取内存学习路线图。
评论