如何管理预测故障分析 (PFA) 内存列表

每当预测故障分析(PFA)根据当前的 PFA 注册表设置预测错误校正码(ECC)内存页可能会出错时,PFA 会存储(或 持久化)该内存页的页帧编号(PFN)。

从 Windows 版本 19042 开始,错误的内存页存储在注册表中的 HKLM\SYSTEM\CurrentControlSet\Control\WHEA\BadPages下。 在早期版本的 Windows 中,此信息存储在启动配置数据 (BCD) 系统存储中。

此列表包含 PFA 预测可能失败的所有内存页的 PFN。 Windows 启动时,它会从系统使用中排除这些内存页。

注意

没有用于将物理内存 PFN 映射到特定物理内存模块的行业标准。 因此,WHEA 无法提供有关哪些内存模块发生故障的信息。

更换失败的系统内存时,系统管理员必须通过更新注册表或使用 BCDEdit 命令行工具手动清除此列表。 如果未清除列表,则即使已替换失败的内存模块,Windows 仍会继续排除列表中的内存页。

此页面介绍如何从错误的内存列表中查看和清除页面帧编号。 要执行下面的步骤,需要一个提升的命令提示符:

  1. 选择开始,指向所有程序,然后选择附件
  2. 右键单击 命令提示符 并选择 以管理员身份运行
  3. 如果显示“用户帐户控制”对话框,请选择对话框中的

在注册表中查看页帧编号(PFN)

若要查看系统注册表中的当前 PFN 列表,请在提升的命令提示符中运行以下命令:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\WHEA" /v BadPages

如果没有预测到任何 ECC 内存页会失效,则 reg 命令的输出将如以下示例所示:

C:\Windows\system32>reg query "HKLM\SYSTEM\CurrentControlSet\Control\WHEA" /v BadPages


ERROR: The system was unable to find the specified registry key or value.

如果预测 ECC 内存页会失效,BadPages 注册表键就会包含一个二进制 blob,封装这些内存页,如下例所示:

C:\Windows\system32>reg query "HKLM\SYSTEM\CurrentControlSet\Control\WHEA" /v BadPages

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WHEA
    BadPages    REG_BINARY    000000000000000058140280000000005C1B0280000000007C30038000000000E2BBFC8000000000AF52188000F00F00

可以使用 PowerShell 使用以下脚本分析注册表数据和输出列表:

$whea = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\WHEA"
$pages = $whea.BadPages
$idx = 0
while($idx -le $pages.Count) {
    $slice = $pages[$idx..($idx+7)]
    [array]::Reverse($slice)
    $page = (($slice | foreach { $_.ToString("X2") }) -join "")
    Write-Output $page
    $idx = $idx + 8
}

从注册表中清除 PFN

若要清除 BCD 系统存储区中的 PFN 列表,请使用以下命令:

reg delete "HKLM\SYSTEM\CurrentControlSet\Control\WHEA" /v BadPages

注意 注册表的更改不当可能会阻止 Windows 启动。 因此,在重启 Windows 之前,必须仔细查看命令及其结果。

查看 BCD 系统存储中的当前 PFN 列表

可以使用 BCDEdit 命令行工具查看和删除 BCD 系统存储中保存的内存页列表。 如需了解可以使用的选项列表,请参阅 BCDEdit Command-Line 选项

若要使用 BCDEdit 工具,您必须是计算机上的 Administrators 组的成员。

在提升的命令提示符下使用以下命令:

C:\Windows\system32>bcdedit /enum {badmemory}

如果未预测任何 ECC 内存页失败,则 BCDEdit 工具的输出将如以下示例所示:

C:\Windows\system32>bcdedit /enum {badmemory}

RAM Defects
-----------
identifier              {badmemory}

如果预测 ECC 内存页将失效,{badmemory} 对象将包含 badmemorylist 值。 此值包含 PFA 预测失败的内存页的 PFN 列表,如以下示例所示:

C:\Windows\system32>bcdedit /enum {badmemory}

RAM Defects
-----------
identifier              {badmemory}
badmemorylist           0xffe38
                        0x100f

从 BCD 系统存储中清除当前 PFN 列表

若要清除 BCD 系统存储区中的 PFN 列表,请运行以下命令:

C:\Windows\system32>bcdedit /deletevalue {badmemory} badmemorylist

注意

对 BCD 系统存储的不当更改可能会阻止 Windows 启动。 因此,在重启 Windows 之前,必须仔细查看命令及其结果。