Memtest86+ 内存诊断工具:免费开源内存检测
什么是 Memtest86+
Memtest86+ 是一款免费、开源的独立内存测试工具,也是常用的内存检测工具,主要用于 x86、x86-64、ARM AArch64 和 LoongArch64 架构电脑的内存检测与内存诊断。与 windows内存诊断这类系统内工具相比,它不依赖操作系统,也不依赖 UEFI 库,可直接由 PC BIOS(legacy 或 UEFI)或支持 Linux 16 位、32 位、64 位、EFI handover 引导协议的中间引导器加载。Memtest86+ 能访问几乎全部内存,不受操作系统占用限制,因此比 BIOS 自带内存测试更彻底。
- 版本沿革:Memtest86+ v6.00 基于 PCMemTest,而 PCMemTest 是早期 Memtest86+ v5 的 fork 和重写,v5 又源于 MemTest-86;重写目标包括让代码更可读、更易维护,使代码 64 位干净并支持 UEFI 启动,同时修复使用新版本 GCC 构建时的失败
- 功能扩展:PCMemTest 过程中曾删除一些并非严格内存测试所需的功能,v6.0 又将缓存和主存速度测量、DRAM 类型识别等能力加回并扩展,形成统一、功能完整的版本
- 许可证:按 GNU GPLv2 发布,除 GPL 规定外没有私有或商业使用限制
- 支持的平台:Pentium 级或更晚的 32 位/64 位 x86 CPU、多数 ARMv8-A AArch64 CPU(仅 UEFI 启动)以及多数 LoongArch64 CPU(Loongson 3 和 Loongson 2 家族)
- 获取方式:二进制稳定版和 nightly 开发版可从 memtest.org 获取,可制作成启动 CD、DVD 或 USB 闪存盘
它适合排查内存故障、蓝屏、死机、数据损坏等问题,但测试也会隐式覆盖 CPU、缓存和主板。
Memtest86+ 的功能介绍
作为专业内存测试工具,Memtest86+ 的核心是多种内存检测算法和测试项目。它使用 moving inversions(移动反转)和 Modulo-20 两类算法近似理想的相邻单元干扰测试。
- 测试项目:Test 0 地址测试 walking ones 无缓存;Test 1 地址测试 own address in window;Test 2 地址测试 own address + window;Test 3 总线压力 read/write turnaround;Test 4 移动反转 ones & zeros;Test 5 移动反转随机序列(x86_64 使用 AVX2 或 SSE2,AArch64 使用 NEON,并使用非临时存储);Test 6 移动反转 8 位模式;Test 7 Modulo 20 随机模式;Test 8 Block move 64 moves;Test 9 移动反转 32/64 位模式;Test 10 位衰减 solid 和随机模式;Test 11 Rowhammer(默认禁用)
- 错误报告模式:包括仅错误计数、错误摘要、个别错误、BadRAM 模式、Linux memmap、坏页;错误统计始终收集,切换报告模式不会丢失当前测试序列的累计统计
- BadRAM 模式:输出 badram=F1,M1,F2,M2...,最多 20 对;Linux memmap 输出 memmap=S1$A1,S2,A2...,最多 20 个故障区域;坏页模式输出十六进制页号或页号范围,最多 20 个范围;超过限制会合并区域,可能包含非故障位置;Test 0、Test 8、Test 3、Test 11 不贡献 BadRAM、memmap 或坏页数据
- 操作热键:启动后可按 F1 进入配置菜单,F2 切换多核 SMP,Space 切换滚动锁,Enter 单条消息滚动,Esc 退出并重启;数字键可代替功能键
- 配置菜单:可选择测试项目、限制地址范围、选择 CPU 顺序(并行、顺序、轮转)、选择错误报告模式、选择 CPU 核、开关温度显示、开关启动追踪,并可跳过下一测试
- 扩展功能:支持内存基准、SMBUS/SPD 解析、DMI 解码、SPD CRC 校验、内存控制器轮询、ECC polling、USB 键盘、显示旋转、屏幕分辨率、串口控制台和机器可解析日志
- 启动选项:包括 nosmp、nobench、nobigstatus、nosm、nospdcrc、nomch、nopause、keyboard=、dark、screen.mode=、screen.rhs-up、screen.lhs-up、efidebug、usbdebug、usbinit=、console=、log=、maxpasses=、testlist=、ecc 等
整体而言,Memtest86+ 提供了从基础内存检测到高级错误报告和配置的完整能力,适合各类内存诊断场景。
如何使用 Memtest86+
使用 Memtest86+ 分为获取、构建、启动、运行与配置几个环节:
- 获取:最简单的方式是从 memtest.org 下载稳定版或 nightly 开发版的二进制/ISO
- 自行构建:官方主要在 Linux 上测试,需要 GNU 工具链(GCC 或交叉 GCC、binutils、make),可选 dosfstools、mtools、xorrisofs;x86 32 位镜像进入 build/i586 执行 make,x86-64 进入 build/x86_64 执行 make,ARM AArch64 进入 build/aarch64 执行 make,LoongArch64 进入 build/loongarch64 执行 make
- 镜像使用:生成 mt86plus 镜像后,若命名为 mt86plus.efi,可由 32/64 位 UEFI 直接启动,也可由 legacy BIOS 软盘模式或中间引导器按 Linux 引导协议加载;执行 make iso 可生成 memtest.iso,可写 CD/DVD 或 USB;写 USB 时必须用 dd 或同类工具将 ISO 直接写入原始设备
- 中间引导器:把 mt86plus 当作没有初始 RAM 磁盘的 Linux 内核,并可在配置中加入启动选项;若使用 16 位引导协议,显示为文本模式 640x400;若使用 32/64 位引导协议,可用文本或图形模式;UEFI 启动必须使用图形模式,framebuffer 至少 640x400,较大时居中显示
- 启动运行:Memtest86+ 会初始化显示并暂停几秒,等待用户配置;若不按键,会自动用单个 CPU 核心运行所有测试,并持续循环进行内存检测,直到用户重启或关机
- 运行时操作:按 F1 可配置,F2 切换多核,Space 控制错误滚动,Enter 在滚动锁开启时单条滚动,Esc 退出并重启;配置菜单可指定测试列表、地址范围、CPU 顺序、错误报告方式、参与测试的 CPU 核、温度显示和启动追踪
- 统计与耗时:错误报告可随时切换,但更改测试、地址范围或 CPU 顺序会开始新的测试序列并重置统计;执行时间取决于 CPU 速度、内存速度和容量;一般来说,一个完整 pass 足以发现大多数明显错误;若怀疑间歇性错误,建议运行更长时间;可用 maxpasses= 限制 pass 数,用 testlist= 只运行指定测试,用 log= 输出机器可解析串口日志
整体来看,下载镜像写入启动介质、开机运行并持续循环检测,即可完成内存诊断。
Memtest86+ 使用的注意事项
使用 Memtest86+ 时,需要注意故障定位、错误判断、USB 键盘、Rowhammer 与统计等问题:
- 故障不一定是内存:Memtest86+ 报错并不一定代表内存条损坏,测试会隐式测试 CPU、缓存和主板,程序无法确定故障根因;多数失败与内存有关,但也可能是其他部件
- 定位故障模块:可采用移除模块、轮换模块、替换模块三种方法;移除模块适合能拆下内存的系统;轮换模块适合至少有三条内存时,每次交换两个槽位,观察失败位或地址是否变化;无法移除时只能逐个替换;内存兼容性也可能导致问题,同一模块在一个系统中正常、在另一个系统中报错并不罕见
- 错误有效性判断:若出现大量连续地址报错且很多位出错,可能是 Memtest86+ 对内存容量识别错误,正在测试不存在内存;若失败地址较少且只有一两位错误,通常错误有效;间歇性错误总是有效;所有有效内存错误都应纠正,边缘内存可能导致数据丢失甚至磁盘损坏;Memtest86+ 不能诊断所有 PC 故障,例如有缺陷的 CPU 可能让操作系统崩溃,也可能让 Memtest86+ 以同样方式崩溃
- USB 键盘:Memtest86+ 的 USB 驱动不支持热插拔,使用 USB 键盘时应在测试前插好并保持连接;USB 驱动会占用部分内存,减少可测试覆盖范围;若 BIOS 支持 USB legacy 键盘模拟,UEFI 启动时可加 keyboard=legacy 以扩大测试范围;部分 UEFI BIOS 需要开启 CSM 才支持 USB legacy 模拟;若 USB 键盘探测失败,可尝试 usbinit= 的兼容模式
- 显示配置:UEFI 模式必须图形模式,legacy 模式使用 BIOS 或引导器设置的分辨率;2 合 1 设备可用 screen.rhs-up 或 screen.lhs-up 旋转显示
- Rowhammer 与 ECC:Rowhammer(Test 11)是对抗性压力测试,默认禁用;它引发的位翻转不代表该地址在正常使用中是坏单元,因此其错误不进入 BadRAM、memmap 或坏页;DDR5 和 ECC 模块可能由片上 ECC 静默纠正单比特翻转,没有报错并不等于免疫
- 统计限制:Test 0、Test 8、Test 3 也因无法确定精确故障地址或属于瞬态接口故障,不贡献 BadRAM、memmap 和坏页;BadRAM、memmap、坏页模式最多记录 20 组,超出后会合并,可能包含非故障位置;更改测试、地址范围或 CPU 顺序会重置错误统计
- 许可证:Memtest86+ 使用 GPLv2 许可证,可自由用于私有或商业用途,但需遵守 GPL 条款
整体而言,Memtest86+ 是排查内存问题的有力工具,但需要结合故障定位方法、错误有效性判断以及硬件环境综合考虑,才能准确得出结论。