
测试固件嵌入式【免费下载链接】memtest86plusOfficial repo for Memtest86项目地址https://gitcode.com/gh_mirrors/me/memtest86plus点击查看免费下载Memtest86 是一款免费开源、独立运行的内存测试工具支持 x86、x86-64、ARM AArch64 与 LoongArch64 架构。本文以仓库 README.md 为主线结合 app/config.c、tests/tests.c、app/badram.c 等源码完整覆盖构建安装、引导方式、启动选项、交互操作、错误报告模式以及每个测试算法的底层实现帮助读者从会用进阶到读懂。项目定位与核心特性Memtest86 是一套独立于操作系统运行的内存诊断程序。与 BIOS 自带的简易内存自检相比它提供了更彻底、更深入的检测能力这由三方面保证覆盖几乎全部物理内存它不受操作系统占用内存的限制也不依赖 UEFI 库之类的底层软件可以直接访问几乎所有内存。多种引导路径既可由 PC BIOSlegacy 或 UEFI直接引导也可由支持 Linux 16-bit、32-bit、64-bit 或 EFI handover 引导协议的中级引导器如 GRUB加载运行。多架构支持适用于大多数 x86 / x86-64 CPUPentium 级别及以上、大多数 ARMv8-A AArch64 CPU仅 UEFI 引导以及大多数 LoongArch64 CPU龙芯 3 与龙芯 2 系列。当前仓库的版本号定义在 app/version.h 中MT_VERSION构建时会由 build/x86_64/Makefile 注入 Git 提交哈希到GIT_HASH。版本沿革与许可协议LicensingMemtest86 以 GNU General Public License version 2GPLv2发布除 GPL 条款外无其他使用限制私用或商用均可详见 LICENSE。Originsv6.00 基于 PCMemTestMartin Whitaker 对 Memtest86 v5 的分支重写后者又源自 MemTest-86。PCMemTest 重写的主要目的是让代码更易读易维护、使代码 64-bit 干净并支持 UEFI 引导、修复新版 GCC 下的构建失败。重写过程中曾丢弃部分非内存测试必需功能如缓存/内存速度测量、DRAM 类型识别这些功能在 v6.0 中已加回并扩展形成了统一、功能完整的版本。构建与安装四种架构与两种镜像产物构建仅在 Linux 系统上经过测试理论上任何使用 GNU 工具链与 ELF 文件格式的系统均可。所需工具GCC 或交叉 GCC、binutils、make以及可选的 dosfstools 与 mtools生成 FAT 镜像、xorrisofs生成 ISO。x86 32 位镜像cd build/i586 make产物为mt86plus二进制镜像可被 32 位 UEFI BIOS 直接引导命名为mt86plus.efi时、被 legacy BIOS 以软盘模式引导或被中级引导器以 Linux 16-bit 引导协议加载也支持 32-bit 与 32-bit EFI handover 引导协议。x86-64 64 位镜像cd build/x86_64 make产物mt86plus可被 64 位 UEFI BIOS 直接引导命名为mt86plus.efi、被 legacy BIOS 以软盘模式引导或被中级引导器以 Linux 16-bit、32-bit、64-bit 或 64-bit EFI handover 引导协议加载。ARM AArch64 64 位镜像cd build/aarch64 make不在 AArch64 主机上构建时Makefile 默认使用aarch64-linux-gnu-交叉工具链若你的交叉工具链命名不同可传CC、LD、OBJCOPY覆盖。产物mt86plus可由 64 位 UEFI 固件直接引导命名为mt86plus.efi或在可移动介质上放置为EFI/BOOT/BOOTAA64.EFI。UEFI 是该架构唯一支持的引导方式。LoongArch64 64 位镜像在 x86-64 Linux 环境交叉编译sudo mkdir /opt/LoongArch_Toolchains -p; cd /opt/LoongArch_Toolchains # 用 wget 下载最新版交叉编译器x86_64-cross-tools-xxxxxx.tar.gz sudo tar -xvf x86_64-cross-tools-xxxxxx.tar.gz export PATH/opt/LoongArch_Toolchains/cross-tools/bin/:$PATH cd build/loongarch64 make CCloongarch64-unknown-linux-gnu-gcc LDloongarch64-unknown-linux-gnu-ld OBJCOPYloongarch64-unknown-linux-gnu-objcopy在 LoongArch64 Linux 环境本机构建进入build/loongarch64目录直接make即可。产物mt86plus可被 64 位 UEFI BIOS 直接引导命名为mt86plus.efi也可被中级引导器以 64-bit EFI handover 引导协议加载。生成可引导 ISO 与 USB 启动盘四种架构统一支持make iso产物为memtest.iso可直接刻录到空白 CD/DVD或写入 USB 闪存盘。注意写入 USB 时必须以原始写入dump方式写整个裸设备——用dd命令或提供同等功能的工具不能像复制普通文件一样拷贝。使用 GRUB 作为中级引导器的测试 ISO仓库还提供了用 GRUB 作为中级引导器的测试用 ISO 构建目标grub-iso细节见各架构 build/x86_64/Makefile。该 ISO 同时支持 legacy 与 UEFI 引导因此构建系统需要同时装有两种 GRUB 模块Debian 上对应grub-pc-bin、grub-efi-ia32-bin、grub-efi-amd64-bin、grub-efi-arm64-bin与grub-efi-loong64-bin等软件包。可能需要按本机命名调整 Makefile 中的路径与文件名。LoongArch64 的 GRUB ISO 只能在 LoongArch64 Linux 环境下生成。grub 目录下的 GRUB 配置文件grub/grub-legacy.cfg 与 grub/grub-efi.cfg除了用于测试 ISO也是从 GRUB 引导 Memtest86 的官方示例。例如 legacy 配置中的典型菜单项menuentry Start Memtest86, use built-in support for USB keyboards { linux /boot/memtest keyboardboth } menuentry Start Memtest86, use BIOS legacy emulation for USB keyboards { linux /boot/memtest keyboardlegacy } menuentry Start Memtest86, disable SMP and memory identification { linux /boot/memtest nosmp nosm nobench }使用时mt86plus文件应存放在引导器可访问的磁盘分区中并把引导配置指向该文件——如同引导一个没有初始 RAM 磁盘的 Linux 内核。引导协议与显示模式使用 16-bit 引导协议时Memtest86 以文本模式640×400显示。使用 32-bit 或 64-bit 引导协议时根据引导器传入的boot_params结构选择文本模式或图形模式若为图形模式传入的 framebuffer 至少应为 640×400 像素更大时画面居中显示。UEFI 模式引导时必须使用图形模式。Boot 命令行选项完整参考与源码解析中级引导器可以向 Memtest86 传递一条引导命令行多个选项以空格分隔每个选项由选项名构成可后跟与一个或多个逗号分隔的参数。以下选项均被识别选项作用与参数nosmp禁用 ACPI 表解析与多 CPU 核心的使用nobench禁用内置内存基准测试nobigstatus禁用大的 PASS/FAIL 弹窗状态显示nosm禁用 SMBUS/SPD 解析、DMI 解码与内存基准测试nomch禁用内存控制器配置轮询nopause跳过启动时的配置暂停keyboardtype键盘类型取legacy、usb或bothdark把默认背景色从蓝色改为黑色screen.modew*x*h仅 EFI framebuffer指定首选屏幕分辨率如1024x768screen.modebios仅 EFI framebuffer使用 UEFI BIOS 设定的默认分辨率screen.rhs-up仅图形模式画面顺时针旋转 90 度screen.lhs-up仅图形模式画面逆时针旋转 90 度efidebug显示 EFI framebuffer 相关信息usbdebug探测 USB 键盘后暂停usbinitmode1 对高速设备使用两步初始化序列2 初始化序列中增加一次 USB 复位3 模式 1 与 2 的组合consolettyS*x*,*y*激活串口/tty 控制台输出。x为 IO 端口0 0x3F8、1 0x2F8、2 0x3E8、3 0x2E8y为可选波特率9600、19200、38400、57600、115200未指定或非法时默认、230400console*x*,*y*激活 MMIO UART 控制台。x为 MMIO 寄存器宽度mmio8-bit、mmio1616-bit、mmio3232-bity为 MMIO 地址十六进制带0x前缀如0xFEDC9000newline每次更新 framebuffer 后额外打印一个换行便于串口日志捕获仅在控制台/串口输出时使用testlistx,y,z指定要运行的测试编号列表逗号分隔。指定后初始测试配置被修改为仅激活列表中的测试例如testlist0,1只运行测试 0 与 1ecc启用 ECC 轮询源码视角选项如何被解析以上解析逻辑实现在 app/config.c 的parse_option()约 L292 起与parse_command_line()约 L385 起中命令行按空格切分选项、按切分参数。从源码可以看出若干未写入 README、但实际被支持的选项本文仅作实现事实补充reportmodenone|summary|address|badram|memmap|pages直接在命令行指定错误报告模式对应ERROR_MODE_*枚举。cpuseqmodepar|seq|rr|one直接指定 CPU 排序模式并行/顺序/轮询/单核。numa/nonuma启用或禁用 NUMA 相关处理。powersaveoff|low|high控制电源节省策略源码默认POWER_SAVE_HIGH。trace启用启动追踪调试用。noehci忽略 EHCI 主机控制器加入USB_IGNORE_EHCI标志。串口波特率解析parse_serial_params()还支持76800这个 README 表格之外的取值。另外在 AArch64 平台上consolettyAMA,0x...形式会把 UART 识别为 ARM PL011 而非 16550。测试列表参数则由parse_test_list()处理先禁用全部 12 个测试再按逗号分隔的数字逐个启用并做边界校验011。键盘选择legacy 与 USB 的权衡Memtest86 同时支持 legacy 键盘接口经 I/O 或 MMIO 端口 0x60/0x64与 USB 键盘使用自带的 USB 设备驱动。可通过引导命令行二选一或两者兼用若命令行未指定UEFI 模式默认两者都用legacy 模式默认仅用 legacy 接口。较老的 x86/x86-64 BIOS 通常支持 USB legacy 键盘模拟使 USB 键盘表现为连接在 0x60/0x64 端口上的 legacy 键盘这通常可在 BIOS 设置菜单中开关。若启用 Memtest86 的 USB 驱动将覆盖模拟机制、直接访问 USB 键盘。代价是USB 控制器与设备驱动需要保留一部分私有内存这部分内存无法被内存测试覆盖。因此为最大化测试覆盖率建议若 BIOS 支持则开启 USB legacy 键盘模拟UEFI 引导时在命令行追加keyboardlegacy。注意部分 UEFI BIOS 只有在开启 Compatibility System ModuleCSM后才支持 USB legacy 键盘模拟另一些则仅在 legacy 模式下支持。许多 USB 设备并不完全符合 USB 规范。若 USB 键盘探测挂起或检测不到键盘可尝试usbinit提供的各种工作区。注意Memtest86 的 USB 驱动目前不支持热插拔。使用 USB 驱动时键盘应在运行前插好并全程保持连接。显示旋转与屏幕分辨率显示旋转部分二合一设备使用原生竖屏 LCD安装在键盘上时侧向放置。图形模式下Memtest86 可旋转显示以匹配物理方向——按 LCD 的安装方向在命令行加screen.rhs-up顺时针 90°或screen.lhs-up逆时针 90°。文本模式下则期望由 BIOS 自动处理。屏幕分辨率legacy 模式引导时使用 BIOS 或中级引导器设定的分辨率UEFI 模式引导时通常选择能容纳 640×400 显示的最小可用分辨率。某些 BIOS 会返回错误的显示模式信息可用screen.mode选项覆盖。注意启用显示旋转时screen.mode指定的分辨率针对的是未旋转的显示。操作方式快捷键与配置菜单引导完成后Memtest86 初始化显示随后暂停数秒等待配置若未按键则自动以单 CPU 核心运行全部测试并持续无限循环直到用户重启或关机。启动及运行期间支持的按键按键功能F1进入配置菜单F2切换多 CPU 核心SMP开关Space切换滚动锁停止/继续错误信息滚动Enter单条消息滚动仅在滚动锁启用时Escape退出测试并重启机器注意滚动锁启用且滚动区域已满时测试会暂停。所有情况下数字键可替代功能键1 F12 F2……0 F10。配置菜单可调项测试选择默认全部源码中即 tests/tests.c L52-70 的test_list[]数组菜单对应test_selection_menu()。地址范围默认全部内存通过pm_limit_lower/pm_limit_upper限制update_num_pages_to_test()据此计算待测页数。CPU 排序模式默认并行parallel每个 CPU 核心并行测试内存区域的子集sequential每个 CPU 核心依次测试整个内存区域round robin单个 CPU 核心测试整个内存区域每轮测试以轮询方式换核。错误报告模式默认逐条错误错误计数 / 错误汇总 / 逐条错误 / BadRAM 模式 / Linux memmap / bad pages。CPU 核心选择仅启动时最多可选 256 个核心受内存与显示限制BSP引导处理器不可取消选择。温度显示开关仅启动时CPU 温度与内存RAMDDR5 温度轮询温度。启动追踪开关仅启动时调试用。跳到下一测试运行测试时。配置菜单的运行态行为在 app/config.c 的config_menu()中实现启动暂停逻辑在initial_config()中若设置了nopause则直接跳过。此外混合架构 CPU如 Intel P/E 核在 CPU 选择菜单中还可通过 F6 包含/排除 E-Core源码exclude_ecores默认开启。错误报告六种模式详解错误报告模式可随时切换且不打断当前测试序列。错误统计无论当前模式如何都会持续收集切到汇总模式即可看到自本序列开始以来的累计统计。注意几点累积规则BadRAM 模式仅在处于 BadRAM 模式时累积 BadRAM 模式memmap 区域仅在处于 memmap 模式时累积bad page 编号仅在处于 bad page 模式时累积任何对测试选择、地址范围或 CPU 排序模式的修改都会开启新的测试序列并重置错误统计。错误计数Error Counts Only仅显示当前测试序列开始以来发现的总错误数。错误汇总Error SummaryLowest Error Address / Highest Error Address报错的最低/最高地址Bits in Error Mask所有出错位的十六进制掩码Bits in Error所有错误实例的错误位数总计以及每个错误实例错误位数的最小/最大/平均值Max Contiguous Errors连续出错地址的最大数量Test Errors每个单独测试的错误总数。逐条错误Individual Errors每条错误实例显示pCPU发现错误的物理 CPU 核心号Pass出错时所在的测试遍数一遍 当前选中全部测试跑完一次Test出错的单独测试编号Failing Address出错的内存地址Expected期望的十六进制数据模式Found从出错地址读到的十六进制数据Err Bits仅 32 位构建显示错误位的十六进制掩码。BadRAM Patterns累积并显示用于 Linux BadRAM 特性或 GRUBbadram命令的错误模式。行格式为badramF1,M1,F2,M2...每个F,M对中F是故障地址M是位掩码——表示在 M 所有为 1 的位上与 F 相等的地址都可能出错。这类模式可能捕获比实际更多的错误但至少能覆盖全部错误专为以紧凑语法捕获硬件结构造成的规律性错误而设计。源码层面模式累积实现在 app/badram.cMAX_PATTERNS定义为20因此模式对数被约束为 20出于多种实际原因。模式是增量生长而非基于全部错误重新计算的因此在异常情况下从地址打印模式的输出手工构造模式可能得到更好结果。模式合并的关键是COMBINE_MASK(a,b,c,d) (b d) ~(a ^ c)——新旧掩码的交集去掉地址不同的位保证新掩码尽可能选择性。注意测试 0walking-ones 地址测试与测试 8块移动因无法确定故障精确地址不参与BadRAM 模式测试 3总线压力的错误通常是瞬时接口故障而非坏单元同样不参与测试 11Rowhammer诱导的翻转不代表正常使用下的缺陷单元也不参与。Linux memmap累积并显示用于 Linuxmemmap引导命令行参数的错误内存区域。行格式为memmapS1$A1,S2,A2...每个S,A对中A是区域首地址S是区域大小字节。最多记录 20 个故障区域一旦超过 20 个连续故障位置区域区域会被合并可能包含少量非故障位置程序会尽量最小化包含的非故障位置。同样地测试 0、3、8、11 不参与故障区域累积。Bad Pages累积并显示故障内存页号可与 Windowsbcdedit命令配合将这些页加入 Windows PFA 内存列表。页号显示为单个十六进制数如0x20或十六进制范围如0x20..0x2a。最多记录 20 个故障页范围超过后范围会合并并尽量最小化包含的非故障页。测试 0、3、8、11 同样不参与。内存故障排查实战请留意并非所有 Memtest86 报告的错误都源于坏内存。测试隐含地同时测试了 CPU、缓存与主板程序无法判定故障的具体来源大多数故障由内存导致但也可能是其他部件此时唯一办法是逐个替换部件直至故障消失。确定故障模块并非直接了当的过程主板厂商与内存槽组合众多。以下是三种常用技术移除模块最直接。选择性移除模块再运行测试记录测试通过/失败时系统中各模块的确切位置即可定位坏模块。轮换模块仅当至少有三条模块且无法移除时使用。每次对调两个槽位的模块如槽 1 与槽 2 互换再测试若失败位或失败地址随之改变说明被移动的模块之一就是故障源多组对调组合即可锁定故障模块。更换模块前两者都不可行时只能逐条替换模块来定位故障。兼容性问题内存错误有时源于组件不兼容——一条内存模块在一个系统正常、在另一个系统异常并不罕见组件未必损坏只是某些组合需要避免。错误有效性判断绝大多数情况下报告的错误是真实有效的。但某些系统会让 Memtest86 对内存容量判断出错转而测试不存在的内存导致大段连续地址报错且通常错误位数很多。反之失败地址数量较少且只有一两个位出错时可以确定错误是真实有效的间歇性错误也总是有效的。所有有效内存错误都应被修正——虽然某个错误可能永远不在正常运行中出现但在边缘状态的内存上运行是有风险的可能导致数据丢失甚至磁盘损坏。另外Memtest86 无法诊断许多 PC 故障例如一个让操作系统崩溃的坏 CPU大概率也会以同样方式让 Memtest86 崩溃。执行时间与通过计数完整跑完一遍的时间因 CPU 速度、内存速度与内存容量差异很大。程序无限执行每次所有选中测试全部跑完时 pass 计数器加一。通常单遍即可捕获除最隐晦错误外的大部分问题但若怀疑间歇性错误为了完全放心建议延长测试时间。内存测试哲学许多内存测试只是不加思考地往内存里扔一些模式对内存架构或错误检测机制缺乏理解——这对硬故障有效却几乎无法发现间歇性错误BIOS 自带的内存测试对间歇性错误基本无用。内存芯片由紧密排列的大量存储单元组成每个数据位一个单元。绝大多数间歇性故障源于单元间的相互作用写入一个单元常常会让相邻单元被写入同样的数据。有效的内存测试应当检测这种状况。理想策略是向一个单元写入 0向所有相邻单元写入 1一次或多次检查第一个单元是否仍为 0。显然这一策略需要精确了解芯片上存储单元的物理布局而不同芯片类型与厂商的布局千变万化使该策略不可行。不过存在可以近似这一理想策略的测试算法。两大核心测试算法Moving Inversions移动反转用某种模式填满内存从最低地址开始检查模式未变 → 写入模式的补码 → 地址递增 → 重复从最高地址开始检查模式未变 → 写入模式的补码 → 地址递减 → 重复。这是对理想测试的良好近似但有局限当今多数高密度芯片按 416 位宽度存储数据对多位宽的芯片无法只读/只写一个位因此无法保证所有相邻单元都经过相互作用测试只能通过多种模式确保相邻单元被写入所有可能的 0/1 组合。更关键的是缓存、缓冲与乱序执行会干扰移动反转算法使其效率降低。缓存可以关闭但新高性能芯片的内存缓冲无法禁用。Modulo-20为弥补上述局限而创建不受缓存或缓冲影响算法如下对起始偏移 019每 20 个位置写入一个模式其余所有位置写入该模式的补码重复上一步一次或多次检查每 20 个位置的模式。它达到与移动反转几乎同等的相邻性测试水平且不受缓存/缓冲干扰——因为分离的写遍与读遍都覆盖全部内存可以保证遍与遍之间所有缓冲与缓存已被冲刷。步长 20 的选择有些随意更大的步长可能更有效但耗时更长20 是速度与彻底性之间的合理折中。源码佐证该算法实现在 tests/modulo_n.c 的test_modulo_n()MODULO_N常量定义在 tests/tests.c L43 为 20。实现依次执行以步长n写pattern1→ 以iterations遍写其余位置的pattern2→flush_caches()→ 逐n校验pattern1任何失配调用data_error()记录。随机序列生成器为 xorshifttests/test_helper.h 中prsg()64 位下为 13/7/17 移位。十二大测试逐一解析Memtest86 执行一系列编号测试。每个测试是测试算法 数据模式 缓存策略的组合执行顺序经过安排以最快速度暴露错误。为了在 32 位 CPU 上测试超过 4GB 内存物理地址范围被拆分为 1GB 窗口一次映射一个到虚拟内存窗口每个窗口可含一个或多个连续内存区域多数测试对各区域依次执行。除第一个测试外其余测试均启用缓存。下表给出了每个测试在 tests/tests.c L52-70 测试表中的默认启用状态、CPU 模式ONE 单核顺序、PAR 并行、阶段数与迭代次数并结合run_test()L124-322说明实现编号测试名默认启用CPU实现要点0Address test, walking ones, no cache是ONE关闭缓存后用 walking-ones 地址模式测试所有地址位见 tests/addr_walk1.c1Address test, own address in window否ONE每地址写入自身地址再校验无论何种 CPU 排序模式都按单核顺序执行见 tests/own_addr.c2Address test, own address window是ONE写入虚拟地址 窗口号32 位或自身物理地址64 位捕捉逐窗口测试会漏掉的高位地址位错误同样强制单核顺序执行3Bus stress, read/write turnaround是PAR每 CPU 把内存块一分为二用非临时写填充一半、同时读校验另一半迫使写→读频繁翻转及行/库冲突针对 DDR5 时代片内 ECC 无法纠正的接口故障信号完整性、XMP/EXPO 训练边缘、PMIC 电压跌落x86_64 与 AArch64 使用与测试 5 相同的非临时 SIMD 内核其他平台回退到缓存标量访问错误通常瞬时、地址不定4Moving inversions, ones zeros是PAR全 1 / 全 0 两种模式分别执行移动反转见 tests/mov_inv_fixed.c5Moving inversions, random sequence是PAR向量级伪随机序列及其补码x86_64 用 AVX2256 位或 SSE2128 位AArch64 用 NEON128 位启动时自动选择并在测试名中显示tests/tests.c 的test_list_init()会改写测试 5 的描述如[Moving inversions, random (AVX2)]写操作用非临时存储绕过缓存、最大化内存总线压力每第 4 轮广播单个随机值到所有 lane复现经典随机模式测试的均匀背景故障模型随机序列每轮每遍不同多遍更有效6Moving inversions, 8 bit pattern是PAR8 位宽 walking-ones / walking-zeros 模式初始0x8080...每轮右移一位共 8 轮7Modulo 20, random pattern是PARModulo-20 算法 随机数及其补码随机数每遍不同因不受缓存掩蔽影响排在长移位模式测试之前尽早探测各类故障8Block move, 64 moves是PAR基于 Robert Redelmeier 的 burnBX 测试每 8 字节反转的移位模式初始化内存再用movs指令搬移数据块后校验。由于搬移完成后才校验无法得知错误发生位置报告地址只是发现坏模式的位置——因此不参与 BadRAM/memmap/bad pages 累积9Moving inversions, 32/64 bit pattern是PAR32 位构建用 32 位宽、64 位构建用 64 位宽的 walking-ones/zeros 模式且每个连续地址把模式旋转 1 位快速首遍只走一半位位置完整遍走全部见 tests/tests.c L291offset_step (pass_num 0) ? 2 : 110Bit fade test, solid and random patterns是PAR全内存填模式后静置数秒再校验每遍 4 轮全 0、全 1、地址种子随机模式及其补码——分别探测两种衰减极性、以相反电荷邻居压力测试单元、每遍都是全新可复现的电荷配置iterations即静置秒数11Rowhammer否ONE默认禁用。反复激活hammeringDRAM 行可使物理相邻行漏电翻转位而无需访问这些行用 Blacksmith 式模式多面、非均匀、与 DRAM 刷新同步的激活突发对抗现代2020模块的片内 Target Row RefreshTRR缓解每次侵略者访问都强制到达 DRAM 阵列x86 上刷缓存行其他平台整缓存冲刷随后检查相邻受害者行因物理地址到 DRAM 行映射未知先尝试从 row-buffer-conflict 时序恢复相邻行步长不可观测时如虚拟化下回退到盲步长扫描单核运行保持激活时序与刷新同步干净每个窗口有固定时间预算总运行时间随内存量增长Rowhammer 是对抗性压力测试而非常规数据测试它诱导的翻转不代表正常使用下该地址是缺陷单元因此错误会被报告但不参与 BadRAM/memmap/bad pages 累积。在 DDR5 与 ECC 模块上片内 ECC 可能静默纠正单位翻转因此未报告错误本身不能证明模块免疫。补充两点源码级观察其一测试 1own address in window在测试表中默认处于禁用状态enabled false测试 11Rowhammer同样默认禁用需要时可在配置菜单或通过testlist启用其二测试 3 的迭代数在首遍会被除以 3tests/tests.c L186-188测试 9 同理L288-290而测试 5 的每次调用由(i 3) 3决定是否广播统一随机背景——这些细节体现了每个测试针对性的时序设计。已知限制、Bug 与代码贡献已知问题与功能增强请求请参阅仓库维护的公开 issue 与讨论列表欢迎提交 Bug 报告。代码贡献修 Bug 或增强均受欢迎基本指引见 doc/README_DEVEL.md。致谢v6.0 基于 Martin Whitaker 的 PCMemTest其又基于 Samuel Demeulemeester 的 Memtest86 v5.01最终可追溯至 Chris Brady 的 Memtest86。源码中bootsect.S、setup.S、head.S、build.c的早期版本源自 Linux 1.2.1 内核并经大幅修改BadRAM 模式代码由 Rick van Rein 提供块移动测试基于 Robert Redelmeier 的 burnBXLoongArch64LA64的初始支持由 Chao Li 与 Dongyan Qian 提供。结语从构建镜像、选择引导协议到逐条解读十二个测试算法的设计动机与源码实现Memtest86 的完整能力图谱已在本文展开。实际使用中最值得记住的三条建议是最大化测试覆盖率时优先 legacy 键盘模拟并加keyboardlegacy怀疑间歇性错误时延长测试时间而非单遍了事分析错误输出时区分真实坏单元与瞬时接口故障测试 3或人为诱导翻转测试 11。更进一步BadRAM 模式与 Linuxmemmap、Windows bad pages 输出可直接与操作系统对接把诊断结果转化为运行时的内存屏蔽策略。赞分享测试固件嵌入式【免费下载链接】memtest86plusOfficial repo for Memtest86项目地址https://gitcode.com/gh_mirrors/me/memtest86plus点击查看免费下载相关推荐如何快速上手Awesome Web Archiving初学者必备的5个网络存档工具如何快速上手Awesome Web Archiving初学者必备的5个网络存档工具 网络存档是收集万维网部分内容以确保信息在档案中保存供未来研究人员、历史学Memtest86终极内存测试工具完全指南Memtest86终极内存测试工具完全指南 Memtest86是一款免费开源的独立内存测试工具适用于x86、x86 64和LoongArch64架构计算测试固件嵌入式Memtest86 深度解析专业内存检测完整攻略Memtest86 深度解析专业内存检测完整攻略 Memtest86 是一款专业级独立内存测试工具专为 x86、x86 64 和 LoongArch64测试固件嵌入式上一篇MuseScore 扩展开发指南Forms、Macros 与 Composite 扩展的创建、清单配置与实战示例下一篇TanStack Table 核心列对象 Column_Core 接口深度解析属性、方法、ID 解析与源码实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考