PCIe M.2 技术

PCIe M.2 技术文档


1. 硬件物理层与接口规范

1.1 M.2 物理规格

M.2(原称 Next Generation Form Factor, NGFF)是一种紧凑型扩展接口标准,用于替代 mSATA 和 mini-PCIe。其命名方式为 WWLL,其中:

  • WW = 宽度(固定为 22 mm)
  • LL = 长度(单位:mm)

常见尺寸:

尺寸代号 长度(mm) 典型用途
2230 30 Wi-Fi、蓝牙模块
2242 42 轻量级 SSD、嵌入式存储
2260 60 中端 NVMe SSD
2280 80 主流消费级/企业级 NVMe SSD
22110 110 高容量企业级 SSD(双面 NAND)

注:2280 是目前桌面与笔记本最广泛采用的规格。

1.2 防呆键位(Keying)

M.2 插槽通过缺口位置(Key ID)定义支持的协议和电气接口:

Key ID 位置(引脚) 支持协议 PCIe 通道数 典型设备
B Key Pin 12–19 SATA、PCIe ×2、USB 2.0/3.0、Audio ≤ 2 lanes SATA SSD、低端 NVMe、网卡
M Key Pin 59–66 PCIe ×4、SATA(部分) ≤ 4 lanes 高性能 NVMe SSD
B+M Key 同时具备 B 与 M 缺口 兼容 B 或 M 插槽 ×2(B)或 ×4(M) 通用型 NVMe SSD(如 Samsung 970 EVO)

⚠️ 关键区分

  • M.2 是物理接口标准(定义尺寸、引脚、供电)
  • NVMe 是逻辑协议(运行在 PCIe 之上的存储协议)
  • 一块 M.2 SSD 可能使用 SATA 协议(走 AHCI)或 NVMe 协议(走 PCIe),二者不可混用。

1.3 电气特性

  • 供电电压:+3.3V(主电源),部分支持 +1.8V 辅助电源
  • 最大功耗:通常 ≤ 8W(高性能 SSD 可达 10W+,需主板供电支持)
  • 信号完整性
    • PCIe 通道需严格阻抗控制(差分 85–100 Ω)
    • 高速信号(>8 GT/s)对 PCB 走线长度、过孔、参考平面敏感
  • 热设计
    • 高性能 NVMe(如 PCIe 4.0 ×4)在持续写入时温度可达 70–85°C
    • 主板常配备 M.2 散热马甲(Heatsink),部分支持热节流(Thermal Throttling)

1.4 与传统接口对比

接口 带宽(理论) 协议 尺寸 热插拔 典型用途
M.2 (PCIe ×4) 4 GB/s (3.0) / 8 GB/s (4.0) NVMe / SATA 超紧凑 否(通常) SSD、Wi-Fi
mSATA 0.6 GB/s AHCI (SATA) 类似 M.2 2242 老旧 SSD
PCIe x4 插槽 同 M.2 任意 PCIe 大型 显卡、网卡
SATA III 0.6 GB/s AHCI 线缆连接 2.5" SSD/HDD

M.2尺寸命名

下表列出了PCI Express M.2规范5.1版中有关M.2命名方式的详细信息

NOTES:

  1. 仅在双插槽规格时使用。
  2. 高度尺寸中包含标签。
  3. 该尺寸为11.5毫米,但在类型命名中写作11(例如,BGA类型1113)。
  4. 对于BGA SSD,最大高度以锡球压缩后的高度为准,无论BGA直接安装在平台上还是安装在模块板上都适用。
  5. 采用连接器设计时,允许有绝缘标签。
  6. Key G仅供客户使用,带有该钥位的产品不属于M.2标准,使用风险由客户自行承担。
  7. 仅在需指定顶部表面为平面的情况下使用。
  8. 仅当扩展卡的单针脚电流需求超过0.5安(正常功率额定值)和/或卡片外形更改为M.2-1A类型时使用。
  9. M.2-1A仅支持22毫米和30毫米宽度。

2. 协议栈与传输标准

2.1 M.2 支持的协议

M.2 本身不规定协议,仅提供物理连接。通过 Key 位选择协议:

  • SATA 模式:使用 AHCI 驱动,性能受限于 SATA III(~600 MB/s)
  • PCIe 模式:支持 NVMe(主流)或其他 PCIe Endpoint(如网卡、GPU)

✅ 当前 >95% 高性能 M.2 SSD 采用 PCIe + NVMe 组合。

2.2 PCIe 版本与带宽

PCIe 版本 单通道带宽(单向) ×4 总带宽(双向) 实际吞吐(NVMe)
PCIe 3.0 985 MB/s ~3.94 GB/s ~3.5 GB/s
PCIe 4.0 1.97 GB/s ~7.88 GB/s ~7.0 GB/s
PCIe 5.0 3.94 GB/s ~15.75 GB/s ~14 GB/s

📌 实际吞吐受 NAND 速度、主控、队列深度限制,通常低于理论值。

2.3 NVMe 协议架构

NVMe 专为 PCIe SSD 设计,核心优势在于 高并行性低延迟

核心机制:

  • Submission Queue (SQ):主机向设备提交 I/O 命令
  • Completion Queue (CQ):设备返回完成状态
  • 多队列(Multi-Queue)
    • 每个 CPU 核可绑定独立 I/O 队列(减少锁竞争)
    • 队列深度可达 64K 条目(AHCI 仅 32)
  • 命令类型
    • Admin Commands:创建/删除队列、固件更新、SMART
    • I/O Commands:Read/Write/Flush/Dataset Management

与 AHCI 对比优势:

特性 AHCI (SATA) NVMe (PCIe)
队列深度 1(32 条目) 多队列(64K 条目)
中断延迟 高(MSI-X 有限) 极低(MSI-X + 多向量)
CPU 利用率 低(高效批处理)
并行性 串行命令处理 真正并行 I/O

2.4 其他 M.2 应用

  • Wi-Fi 6/6E/7 模块:使用 PCIe + USB 协议(Key E,非本节重点)
  • WWAN(4G/5G):Key B
  • 蓝牙、SSD 缓存模块:均通过 M.2 实现小型化

3. 典型应用场景与产品生态

3.1 主流产品

  • 消费级:Samsung 980 Pro(PCIe 4.0)、WD Black SN850X、Crucial T700(PCIe 5.0)
  • 企业级:Intel P5510、Micron 9400、Kioxia CM7
  • 嵌入式:Solidigm D5-P5336(30.72TB,22110)

3.2 部署差异

平台 特点
笔记本 通常 1× M.2(2280),供电/散热受限,多用 PCIe 3.0/4.0
台式机 1–3× M.2 插槽,支持 PCIe 4.0/5.0,常带散热片
服务器 多 M.2 或 U.2 + M.2 混合,支持热插拔、PLP(断电保护)
嵌入式 2242/2230 尺寸,宽温设计,低功耗模式

3.3 高级用例

  • RAID 0/1:通过主板 BIOS 或 Linux mdadm 软件 RAID
  • 缓存加速:Intel RST、Linux bcache / dm-cache
  • 持久内存(PMEM):部分 Optane M.2 设备支持,通过 ndctl 管理
  • M.2 扩展卡:PCIe x4 转 1/2/4× M.2,用于无原生 M.2 插槽的台式机

4. Linux 内核支持与驱动架构

4.1 驱动模型

Linux NVMe 驱动位于:

drivers/nvme/
├── host/          # 主机端驱动
│   ├── pci.c      # PCIe 探测与初始化(核心)
│   ├── core.c     # 通用 NVMe 逻辑
│   └── ...
├── target/        # NVMe-oF(网络存储)
└── ...

关键内核配置选项(/boot/config-*):

CONFIG_NVME_CORE=y     # NVMe 核心框架
CONFIG_NVME_PCI=y      # PCIe NVMe 设备支持
CONFIG_NVME_FABRICS=y  # NVMe over Fabrics(如 TCP/RDMA)

版本要求

  • 基础支持:Linux Kernel ≥ 3.3(实验性)
  • 完整生产支持:≥ 4.4(多队列、blk-mq 集成)
  • PCIe 5.0:≥ 6.0+(需硬件配合)

4.2 设备探测流程

  1. PCIe Enumeration:BIOS/UEFI 或内核扫描 PCIe 总线
  2. 驱动匹配nvme_pci_driver 通过 Vendor/Device ID 绑定
  3. 初始化
    • 读取 CAP(Controller Capabilities)寄存器
    • 分配 SQ/CQ
    • 创建块设备 nvme0n1
  4. 块设备注册:通过 nvme_ns_setup_streams() 等注册到 /dev/

4.3 块设备接口

  • 命名规则
    • Controller: /dev/nvme0(管理接口)
    • Namespace: /dev/nvme0n1(主存储空间)
    • Partitions: /dev/nvme0n1p1, /dev/nvme0n1p2

4.4 blk-mq 与多队列

  • Linux 使用 blk-mq(Block Multi-Queue) 框架将 NVMe 队列映射到 CPU
  • 每个硬件队列 ↔ 一个软件提交队列(struct blk_mq_hw_ctx
  • 启用方式:默认开启(nvme_core.mq_mode=1

4.5 电源管理与热插拔

  • ASPM(Active State Power Management)
    • 通过 pcie_aspm=force 内核参数启用
    • 可降低链路功耗(L0s/L1 状态)
  • D3cold:设备完全断电(需主板支持)
  • 热插拔
    • 需主板 BIOS 启用 PCIe Hotplug
    • Linux 通过 echo 1 > /sys/bus/pci/rescan 触发扫描

4.6 故障排查(dmesg 示例)

# 设备未识别
nvme 0000:01:00.0: Unable to read CAP register
# 超时
nvme nvme0: I/O 12345 timeout
# 电源问题
nvme nvme0: Device not ready; aborting reset
# 固件错误
nvme nvme0: fatal error: DNR bit set

5. Linux 工具链与运维实践

5.1 设备识别

lspci -v | grep -A 10 -i nvme
lsblk                      # 查看块设备
ls -l /dev/disk/by-id/     # 持久化命名(推荐用于 fstab)

持久化 ID 示例:
/dev/disk/by-id/nvme-SAMSUNG_MZVL21T0HCLR-00B00_S699NF0R234567

5.2 性能测试

# 使用 fio 测试随机读写
fio --name=randread --ioengine=libaio --rw=randread --bs=4k \
    --size=1G --numjobs=4 --direct=1 --runtime=60 --group_reporting

# 使用 nvme-cli 查看健康状态
nvme smart-log /dev/nvme0
nvme id-ctrl /dev/nvme0    # 控制器信息
nvme id-ns /dev/nvme0n1    # 命名空间信息

5.3 固件管理

nvme fw-download /dev/nvme0 --fw=file.bin
nvme fw-activate /dev/nvme0 --action=2 --slot=1  # 激活并下次启动生效

5.4 分区与文件系统

fdisk /dev/nvme0n1
mkfs.ext4 /dev/nvme0n1p1
mount /dev/disk/by-id/nvme-... /mnt/ssd

5.5 监控工具

iostat -x 1                 # 实时 I/O 统计
iotop -o                    # 按进程 I/O 排序
smartctl -d nvme -a /dev/nvme0  # SMART 信息(需 smartmontools ≥ 7.0)

5.6 内核调优

  • 队列深度(默认通常足够):
    echo 1024 > /sys/block/nvme0n1/queue/nr_requests
    
  • I/O 调度器(NVMe 推荐 mq-deadline 或 none):
    echo mq-deadline > /sys/block/nvme0n1/queue/scheduler
    
  • 中断亲和性(多核优化):
    # 查看 IRQ
    cat /proc/interrupts | grep nvme
    # 绑定到 CPU 0-3
    echo 0f > /proc/irq/123/smp_affinity
    

附录:PCIe 带宽对比表

PCIe 版本 编码方式 单 Lane 速率 ×4 双向带宽 实际 NVMe 吞吐(典型)
PCIe 3.0 128b/130b 8 GT/s ~31.5 Gb/s (3.94 GB/s) ≤ 3.5 GB/s
PCIe 4.0 128b/130b 16 GT/s ~63 Gb/s (7.88 GB/s) ≤ 7.0 GB/s
PCIe 5.0 128b/130b 32 GT/s ~126 Gb/s (15.75 GB/s) ≤ 14 GB/s

注:NVMe 协议开销、NAND 速度、主控效率导致实际吞吐低于理论值。