> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man4/mca.4.md).

# mca(4)

`mca` — 机器校验架构

## 名称

`mca`

## 描述

`mca` 子系统提供对 x86 机器校验架构（Machine Check Architecture）的支持。CPU 使用此架构报告各种硬件问题，从可纠正错误到不可纠正的致命错误。`mca` 子系统处理 CPU 报告的错误，并根据用户提供的配置进行记录。

`mca` 子系统会自动编译进每个 x86 内核。

## 日志记录

默认情况下，每条消息会记录到四个位置：

* 控制台
* 系统日志（使用 `LOG_KERN` syslog(3) 设施）
* 内核中的事件记录缓存
* 统计数组

管理员可以使用 `hw.mca.uselog` [sysctl(8)](/man8/sysctl.8.md) 或可调参数设置来禁用非致命错误的控制台日志记录。致命错误始终会记录到控制台。

可以使用 `hw.mca.records` [sysctl(8)](/man8/sysctl.8.md) 节点从用户空间访问内核中的事件记录缓存。默认情况下，内核中的事件记录缓存会无限制增长，并包含自系统引导以来接收到的所有 `mca` 事件的记录。可以使用 `hw.mca.maxcount` [sysctl(8)](/man8/sysctl.8.md) 或可调参数设置来限制缓存（此时它将变为环形缓冲区）或完全禁用缓存。

可以使用 `hw.mca.stats` [sysctl(8)](/man8/sysctl.8.md) 节点检索统计数组。

## SYSCTL 变量

该子系统具有多个配置选项，用于控制事件的处理和记录方式。这些选项通过 [sysctl(8)](/man8/sysctl.8.md) 变量或可调参数进行配置。这些设置控制诸如日志目标、事件限制和采样等内容。这些设置直接影响日志的完整性以及处理 `mca` 事件的性能影响。系统管理员可能需要审查这些设置并进行修改，以在其环境中获得适当的行为。

`#include <x86/mca.h>`

`#include <x86/mca.h>`

**`hw.mca.enabled`** （仅可作为可调参数设置。）如果设置为 0，CPU 不会被配置为向内核发送 `mca` 消息。默认值为 1（启用）。

**`hw.mca.log_corrected`** （可作为可调参数或 sysctl 设置。）如果启用，已纠正的消息会记录到控制台、syslog、内核事件缓存和统计数组中（受控制这些设施的单独配置约束）。如果禁用，已纠正的消息仅记录到内核事件缓存中（受控制该设施的单独配置约束）。默认值为 1（启用）。

**`hw.mca.intel6h_HSD131`** （仅可作为可调参数设置。）此设置启用对某些 Intel 桌面 Haswell CPU 可能报告的良性已纠正奇偶校验错误的变通方案。（名称“HSD131”来源于 Intel 关于此问题的勘误报告名称。）默认值为 0（禁用）。

**`hw.mca.amd10h_L1TP`** （仅可作为可调参数设置。）在某些 AMD CPU 上启用一级 TLB 奇偶校验错误的日志记录。此选项对其他 CPU 没有影响。默认值为 1（启用）。

**`hw.mca.erratum383`** （仅可作为可调参数设置。）此设置启用对 AMD Family 10h CPU 上 Erratum 383 的变通方案。该勘误改变了页面提升或降级为超级页（super-pages）的方式。在受影响的 AMD CPU 上，`hw.mca.amd10h_L1TP` 或 `hw.mca.erratum383` 必须有一个开启。如果两者都关闭，系统将在引导时动态启用 `hw.mca.erratum383`。默认值为 0（禁用）。

**`hw.mca.uselog`** （可作为可调参数或 sysctl 设置。）如果启用，系统会将有关非致命 `mca` 事件的消息发送到 syslog 而不是控制台。如果禁用，系统会将有关非致命 `mca` 事件的消息同时发送到 syslog 和控制台。致命事件始终记录到控制台。默认值为 false（禁用）。

**`hw.mca.stats`** （只读 sysctl。）返回一个包含 `MCA_T_COUNT` 个 uint64\_t 值的数组。`enum mca_stat_types` 定义提供了 `MCA_T_COUNT` 的值以及各种事件类型的索引值。

**`hw.mca.log_interval`** （可作为可调参数或 sysctl 设置。）设置记录可纠正错误之间的最短时间（以秒为单位）。速率限制仅在系统记录了一定数量的同类型错误后才会应用。其目的是减少系统看到并尝试记录突发相似错误所带来的影响（尤其是打印到控制台时）。如果此设置为 0，则不应用速率限制。默认值为 0（无速率限制）。

**`hw.mca.cmc_throttle`** （可作为可调参数或 sysctl 设置。仅在启用 [apic(4)](/man4/apic.4.md) 支持且硬件支持 CMC 中断节流时可用。）设置节流 CMC 中断的最长时间（以秒为单位）。在正常操作中，系统会在事件发生时尽快尝试接收 CMC 中断。但是，如果在短时间内发生高频率的事件，系统将开始节流 CMC 中断。当事件继续以高速率发生时，系统将逐渐增加节流间隔，直到达到 `hw.mca.cmc_throttle` 设置。默认值为 60 秒。

**`hw.mca.count`** （只读 sysctl。）返回内核缓存中当前的 `mca` 记录数。这可用于确定通过 `hw.mca.records` [sysctl(8)](/man8/sysctl.8.md) 接口可读取多少条记录。也可用于监控内核记录缓存所使用的内存量。

**`hw.mca.maxcount`** （可作为可调参数或 sysctl 设置。）此设置控制 `mca` 记录的内核缓存的大小和行为。如果设置为 -1，内核缓存无限制增长，并包含自引导或上次更改 `hw.mca.maxcount` 设置以来的完整记录事件。如果设置为 0，则禁用内核缓存。如果设置为正整数，内核缓存将作为环形缓冲区运行，条目数由该设置定义。默认值为 -1（无限制）。

**`hw.mca.interval`** （可作为可调参数或 sysctl 设置。）此设置控制内核主动扫描新 `mca` 事件的频率（以秒为单位）。在许多情况下，CPU 会发送中断以通知新事件。但是，在某些情况下，定期扫描事件会发现新事件。默认值为 300 秒。

**`hw.mca.force_scan`** （仅可作为 sysctl 设置。）将此设置为任何非零值将强制立即扫描 `mca` 事件。将其设置为零无效。这在功能上是一个只写设置。当前值始终为 0，即使在扫描运行时也是如此。默认值为 0（未请求扫描）。

**`hw.mca.records.n`** （只读 sysctl。）用于将 `mca` 记录从内核缓存复制到用户空间进程。[sysctl(8)](/man8/sysctl.8.md) 节点中的 `n` 值是内核缓存中的整数索引。（或者换个说法，“新”值描述了内核应跳过多少条记录才能找到所需记录。）返回值是 `struct mca_record`，定义于

## 加载器可调参数

可调参数可在引导内核之前在 [loader(8)](/man8/loader.8.md) 提示符下设置，或存储在 **`/boot/loader.conf`** 中。所有可调参数都有对应的 [sysctl(8)](/man8/sysctl.8.md) 条目。可调参数已在 SYSCTL 变量章节中列出。

## 兼容性

`mca` 仅在 x86 系统上可用。

## 参见

loader.conf(5), [sysctl(8)](/man8/sysctl.8.md), syslogd(8)

## 作者

`mca` 子系统最初由 John Baldwin <jhb@FreeBSD.org> 编写。

本手册页由 Jonathan Looney <jtl@FreeBSD.org> 编写。
