dmidecode -t memory 是唯一能获取内存品牌和频率原始数据的命令,因其直接读取BIOS/UEFI固件中的SPD信息,而free、/proc/meminfo和lscpu不包含这些字段;需sudo权限,虚拟机中通常无效。

dmidecode -t memory 是唯一能拿到品牌和频率原始数据的命令
别指望 free、/proc/meminfo 或 lscpu,它们压根不存品牌和频率字段。只有 dmidecode -t memory 直接读 BIOS/UEFI 固件里的 SPD 数据,Manufacturer:、Part Number:、Speed: 这些字段才是真实硬件标签。但必须加 sudo,否则报 Cannot access SMBIOS data;虚拟机里基本无效,因为 SMBIOS 内存信息通常不透传。
为什么 grep Speed: 总是漏掉或拼错
常见错误现象:输出里有 Speed:,但对应不上你看到的 Part Number:;或者压根没 Speed: 行。这不是命令失效,而是字段跨 Handle 块混排了——比如 Slot: DIMM_A1 和 Speed: 3200 MT/s 分属两个 Handle(主块 Handle 0x001A 和子块 Handle 0x001B),grep 会把 A 槽的型号和 B 槽的频率强行凑一起。
- 空插槽也会被列出,
Size: No Module Installed的块里所有字段都为空,不能只靠行数判断内存条数量 -
Speed:单位可能是MT/s(DDR4/DDR5 标称值)、MHz或ns,看到3200 MT/s就等效于 DDR4-3200 - 部分主板固件根本没填 SPD,尤其老旧笔记本或精简 BIOS,此时
Speed:显示Unknown或直接缺失
用 awk 按 Handle 分组提取才靠谱
这条命令已在 2026 年主流发行版验证过,能确保同一内存条的 Slot:、Size:、Part Number:、Speed: 不串场:
sudo dmidecode -t memory | awk '/^Handle / {if (size && speed && part) print slot, size, part, speed; slot=""; size=""; speed=""; part=""} /Slot:/ {slot=$0} /Size: [0-9]+ [MG]B$/ {size=$0} /Part Number:/ {part=$0} /Speed:/ {speed=$0} END {if (size && speed && part) print slot, size, part, speed}' | grep -v "No Module Installed"
它做了三件事:
- 遇到新
Handle行就清空上一组变量,强制按物理内存设备切分 - 只匹配以
Size: N GB结尾的行,自动跳过No Module Installed和Size: 0 MB - 末尾
grep -v "No Module Installed"过滤空槽,避免干扰
典型输出:Slot: DIMM_A1 Size: 16 GB Part Number: M471A2K43CB1-CTD Speed: 3200 MT/s
当 dmidecode 报 Permission denied 或全是 Not Specified 时
说明系统禁用了 /dev/mem 访问,或固件未写入完整 SPD。可切换备用方案:
-
sudo lshw -class memory:结构清晰,slot和clock字段可用,但注意clock: 1600000000要换算成1600 MHz;它显示的是总线时钟,不是等效频率 -
sudo strings /sys/firmware/dmi/tables/DMI | grep -A5 -B5 "Part Number\|Speed":不依赖dmidecode二进制,但字符串匹配有误判风险,比如把厂商名里的 “Speed” 当成频率字段 -
decode-dimms(需安装):直接读取 SPD 芯片,比 DMI 更底层,但部分主板 SMBus 被禁用时会失败
真正容易被忽略的点是:即使 Speed: 字段存在,它也只是 JEDEC 标称值;实际运行频率看 BIOS 里 Configured Memory Speed:,受 XMP/EXPO 开关、双通道匹配和 CPU 内存控制器限制——一条标称 3200MHz 的条子,在 B550 主板上可能只跑 2933MHz,这不算故障。











