H05 —— 内存上电后发生了什么:SPD 芯片和 BIOS 内存 Training

金句:每一根内存条能在电脑上正常使用,是因为在开机的一瞬间,有人在背后做了大量的校准工作。


SPD 芯片:内存的”身份证”

每根内存条上都有一个 SPD(Serial Presence Detect)芯片,EEPROM 存储内存的配置信息。

Bash
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 存储了什么

Bash
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-35

BIOS POST 阶段的内存初始化

开机时,BIOS 的内存初始化流程:

Bash
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 里最复杂的一部分——它校准内存信号的时序和电压。

Bash
内存 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 这么复杂

Bash
内存 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 走线长度不同:
  → 即使是同一批生产的两根内存条,走线长度也不同
  → 所以每根内存条需要单独 Training

Linux 下的内存信息查看

Bash
查看内存信息的命令:

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不着急」,回复”资料”获取内存学习路线图。

最后修改: 2024年11月29日

作者

评论

发表评论

您的邮箱地址不会被公开。