Linux RAS 子系统:EDAC/MCE 硬件错误检测与恢复机制深度实战
在云计算数据中心,单条内存的 ECC 纠正错误每天发生数百次。看不见的错误处理机制决定着系统的生死 —— 本文深入 Linux RAS(Reliability, Availability, and Serviceability)子系统的核心架构,展示如何从硬件寄存器到用户空间全链路捕获、分类、记录和恢复处理器/内存/PCIe 硬件错误。
一、为什么 RAS 是"看不见的云基础设施"?
现代服务器平台运行着数万个组件,每个时刻都有硬件单元在经历瞬态(transitive)或持久性(persistent)故障。Google、Meta、阿里云等超大规模运营商公开数据显示:
| 错误类别 | 年均发生率 | 影响 |
|---|---|---|
| 单比特 ECC 纠正(CE) | 每 GB 内存 ~0.1-0.5 次/年 | 可自愈,但预示 DIMM 老化 |
| 多比特 ECC 不可纠正(UE) | 每万台服务器数十次/年 | 立即宕机或静默数据损坏 |
| 缓存奇偶校验 | ~1% 机器/年 | 可恢复,但性能降级 |
| PCIe AER | 波动,取决于链路质量 | 链路断开、设备故障 |
Linux RAS 子系统正是为系统化处理这些硬件异常而设计 —— 从底层寄存器读取,经过 MCE 中断、EDAC 驱动上报,最终到达用户空间的 rasdaemon 守护进程和服务编排系统。这套机制看似冷僻,却是企业级 Linux 发行版认证(如 SAP HANA、Oracle RAC)的硬性要求。
二、硬件错误源与检测机制全景
2.1 x86 平台:MCA(Machine Check Architecture)
Intel 从 P6 处理器开始引入 MCA,AMD 在 K7 之后跟进。MCA 通过一组 MSR(Model-Specific Register)实时记录硬件检测到的错误:
IA32_MCi_STATUS — 错误状态寄存器(包含错误码、修正/未修正标志)
IA32_MCi_ADDR — 错误发生地址(若可用)
IA32_MCi_MISC — 补充信息(如错误类型细分)
IA32_MCG_STATUS — 全局机器检查状态(重启 RIPV/EIPV/RIP flag)
IA32_MCG_CAP — 全局能力寄存器(Bank 数量)
每个 Bank(通常对应一级硬件单元)都有独立的 MCi_STATUS/ADDR/MISC 寄存器三元组。典型服务器 CPU 拥有 6-30 个 Bank,覆盖 L1/L2/L3 缓存、内存控制器(IMC)、互连(UPI/QPI/TileLink)等单元。
MCG_STATUS 三个关键标志:
- RIPV(Restart IP Valid):发生错误时程序计数器能否继续执行。若为 0,则受害者指令无法重试,通常需要 panic。
- EIPV(Error IP Valid):错误 PC 是否指向触发错误的指令。若为 0,则为异步错误(如 DMA/扫描)。
- MCIP(Machine Check In Progress):是否已在处理 MCE,防止递归。
2.2 ARM64 平台:RAS 扩展与 APEI
ARM 从 ARMv8.2 开始标准化 RAS 扩展,核心组件包括:
- 错误记录寄存器组(ERXR):记录处理器错误报告(PE-level errors)
- 错误状态寄存器(ERRSTATUS):包含 UE/CE/DE(Defected)标志和溢出指示
- 错误地址寄存器(ERRADDR):触发错误的物理地址
ACPI 平台通过 APEI(ACPI Platform Error Interface)将硬件错误暴露给 OS:
HEST 表(Hardware Error Source Table)— 描述各错误源的类型和地址
BERT 表(Boot Error Record Table)— 记录启动阶段持久性错误
EINJ 表(Error Injection Table)— 提供软件错误注入入口(测试用)
GHES 表(Generic Hardware Error Source)— ERRORT PE 记录访问点
2.3 内存控制器:ECC 与 Patrol Scrub
现代 DDR4/DDR5 内存控制器在每 64-72 位数据线中嵌入 8 位 ECC 校验位,使用 SECDED(Single Error Correction, Double Error Detection)汉明码。
CE(Corrected Error):汉明码自动翻转错误位,系统只需记录统计。
UE(Uncorrected Error):双比特或更多错误无法纠错,处理器触发 #MC(Machine Check Exception)。
高级内存控制器支持 Patrol Scrub(主动巡检):周期性读取全部内存,提前发现即将升级为 UE 的错误单元,并触发离线页回收。
三、Linux MCE 处理流程
3.1 入口:#MC 异常向量
x86 的 #MC(向量号 18)属于最高优先级异常,发生时处理器立即禁用中断、装载 bank 寄存器快照。内核入口代码位于 arch/x86/kernel/cpu/mce/core.c:
/* arch/x86/kernel/cpu/mce/core.c */
DEFINE_IDTENTRY_MCE(exc_machine_check)
{
int severity;
if (!machine_check_vector)
goto clear_ip; // 如果不可重入则快速退出
/* 第一阶段:立即评估严重度 */
severity = mce_severity(...) ;
if (severity == MCE_PANIC_SEVERITY)
goto panic; /* 内核关键区域,不可恢复 */
if (severity == MCE_EXTMSG_SEVERITY) {
/* CE 场景:记录 CE 计数、触发 page offline */
}
/* 第二阶段:收集错误并继续 */
mce_log(...); // 存入 kfifo 环形缓冲区
kobject_uevent(); // 通知用户态 rasdaemon
}
3.2 MCE 严重度分级
| 严重度 | 动作 | 场景 |
|---|---|---|
| MCE_NO_SEVERITY | 忽略 | 误报、已被固件清除 |
| MCE_KCONTINUE | 记录并继续 | 已知 CE,可恢复 |
| MCE_RECOVERABLE | 尝试恢复(指令重试) | 部分 UE 但受害者不在内核关键区 |
| MCE_PANIC | 立即宕机 | 内核关键区命中 / RIPV=0 / 多级错误 |
3.3 MCE 环形缓冲区与 Kfifo
内核维护一个全局的 kfifo 环形缓冲区 mce_fifo,避免异步路径中的锁争用:
#define FIFO_MAX 1024
static DEFINE_KFIFO(mce_fifo, struct mce, FIFO_MAX);
生产者(硬中断上下文)往 kfifo 入队,消费者(mce_work 上下文工作线程)异步处理后通知用户空间。这套设计确保 #MC 处理函数始终快速返回,不阻塞其他 CPU。
四、EDAC 子系统:内存/缓存控制器统一框架
4.1 架构分层
┌──────────────────────────────────────────────────────┐
│ User Space │
│ rasdaemon ── trace/perf ── sysfs ── journal │
├──────────────────────────────────────────────────────┤
│ EDAC Core │
│ edac_mc (Memory Controller) │
│ edac_device (通用错误设备) │
│ edac_pci (PCIe 设备) │
├──────────────────────────────────────────────────────┤
│ EDAC Drivers │
│ sb_edac (Intel Sandy Bridge+) │
│ skx_edac (Skylake-SP) │
│ amd64_edac (AMD Opteron, EPYC) │
│ thunderx_edac (Marvell ThunderX) │
│ ...
├──────────────────────────────────────────────────────┤
│ Hardware │
│ IMC CSRs — ECC status/address/count registers │
└──────────────────────────────────────────────────────┘
4.2 sysfs 接口
EDAC 暴露给 /sys/devices/system/edac/ 路径:
/sys/devices/system/edac/mc/mc0/
├── ce_count — CE 累计计数
├── ce_noinfo_count — 无地址 CE 计数
├── ue_count — UE 累计计数
├── ue_noinfo_count — 无地址 UE 计数
├── csrow0/ — Chip-Select Row(内存 bank)
│ ├── ce_count
│ ├── ue_count
│ ├── ch0/ — Channel 0
│ │ ├── ce_count
│ │ ├── dimm_dev_type
│ │ ├── dimm_label
│ │ ├── dimm_location
│ │ ├── dimm_mem_type
│ │ ├── size
│ │ └── ...
├── reset_mc_stats — 写入 0 重置统计
├── seconds_since_reset — 自重置以来的秒数
├── size_mb — 该 MC 管理内存大小(MB)
└── uevent — uevent 通知用户空间
4.3 注册与初始化示例
以 Intel Skylake-SP 的 skx_edac 驱动为例:
/* drivers/edac/skx_edac.c */
static int skx_register_mci(struct mem_ctl_info *mci)
{
mci->mctype = MEM_FLAG;
mci->edac_cap = EDAC_FLAG_SECDED;
mci->ctl_name = "skx";
if (EDAC_SECDED)
mci->edac_cap |= EDAC_SECDED; // SECDED ECC
mci->dev_name = pci_name(pdev);
mci->ctl_page_to_phys = NULL;
return edac_mc_add_mc(mci); // 注册到 EDAC core
}
4.4 ACPI EHGPIVS 与固件优先错误处理
现代服务器采用 Firmware First Error Handling 模式:BIOS 的 APEI 表优先吸收硬件错误,决定可恢复的再触发 SCI 中断给 OS。其核心机制是 GHES(Generic Hardware Error Source):
GHES 结构:
├── type — GHESv1(legacy)/ GHESv2(64-bit address)
├── read_ack_register
├── notification type — SCI / NMI
└── status block — 实际错误记录地址
这意味着 OS 可能在硬件报告之前就已看到错误日志,延迟通常控制在毫秒级,但固件层有时会"吞掉"部分 CE(出于性能考虑),导致用户侧看到错误计数不连续。
五、ACPI APEI 与平台错误抽象层
5.1 错误上报流水线
硬件错误 → GHES 触发 SCI 中断 → GHES 驱动解析错误记录 →
├── AER (PCIe) → aer_irq_handler → AER log → recovery
├── Memory Error → ghes_edac_report_mem_ce/ue → edac_mc_handle_error
├── CPU Error → ghes_proc → mce_log
└── Firmware First → BERT read → persist in nvdimm
5.2 eMCA(Enhanced MCA)
Intel 从 Haswell 开始支持 eMCA —— 固件在机器检查发生时将 Bank 寄存器快照写入 SPI Flash 的 OEM-Config Partition。下次系统启动时,OS 从 Flash 提取错误记录并补偿。
这对电源故障场景尤为关键:如果机器检查发生在内核日志写入持久存储之前,eMCA 确保错误不丢失。
读取路径:
drivers/acpi/apei/mce-inject.c // 测试路径
drivers/acpi/apei/erst.c // ERST (Error Record Serialization Table)
drivers/acpi/apei/bert.c // BERT 表解析
5.3 PCIe AER(Advanced Error Reporting)
PCIe 设备通过配置空间报告链路级错误:
AER 寄存器 (PCIe config space 0x100-0x148):
├── Uncorrectable Error Status (0x04)
├── Uncorrectable Error Mask (0x08)
├── Uncorrectable Error Severity (0x0C)
├── Correctable Error Status (0x10)
├── Correctable Error Mask (0x14)
├── Error Source ID (0x40) — 指示错误来源
└── TLP Prefix Log (0x48) — 记录触发故障的 TLP
内核 drivers/pci/pcie/aer.c 使用参数控制行为:
aerdrv_load_early=1 — 最早加载 AER 驱动
pcie_ports=compat — 精简 AER 功能(兼容老旧设备)
aerdriver.multi_subsystem — 多 Root Complex 支持
5.4 软件错误注入:EINJ
ACPI EINJ 暴露 /sys/kernel/debug/apei/einj,允许软件"伪造"硬件错误:
# 注入内存 CE
echo 0x1 > error_type # Memory Error, CE
echo 0x80000000 > param1 # 目标物理地址
echo 0xfffffffffffff000 > param2 # 地址掩码
echo 0 > param3
echo 0 > param4
echo 1 > notrigger # 仅记录不真正触发
这是验证 RAS 流水线正确性的关键工具,Google Syzkaller 和内核 CI 测试套件都依赖它。
六、Poison 处理与 Page Offline 机制
6.1 Memory Poison(内存中毒)
Poison 是硬件标记"这个页面含有 UE"的机制。x86 平台中,Poisoned page 的概念通过以下方式实现:
- CMCI(Corrected Machine Check Interrupt):当 CE 累积超过阈值时触发可编程中断,驱动提前回收内存页
- MCA 的 Address Valid 标志:确认错误可定位到特定 DIMM/Page
- Page Offline:调用
memory_failure()内核函数将页面标记为 hwpoison 并移出可用内存池
6.2 hwpoison Page 处理
/* mm/memory-failure.c */
int memory_failure(unsigned long pfn, int flags)
{
struct page *p = pfn_to_page(pfn);
/* Step 1: 隔离页面 */
if (!get_hwpoison_page(p, flags))
return -EBUSY;
/* Step 2: 通知文件系统的 page cache 失效 */
if (PageLRU(p) || PageHuge(p))
...
/* Step 3: 解除进程映射(支持 remap) */
kill_procs(pfn, flags, ...
/* Step 4: 从 buddy 分配器移除,标记 HWPoison */
if (!me_memory_failure(...))
res = -EIO;
return res;
}
当进程触发 SIGBUS 指向已 hwpoison 的页时,关键步骤包括:
- 内存锁(mlock)页面:无法释放,只能返回进程资源
- KSM 合并页面:需拆分合并
- 匿名页面:尝试从 swap 恢复,否则 SIGBUS
- Filebacked 页面:从磁盘重新加载(若文件系统允许)
6.3 CMCI 与 Patrol Scrub 联动
/* mce_intel.c */
static void intel_init_cmci(void)
{
if (!mce_available(&boot_cpu_data))
return;
/* 配置 CMCI 阈值(如 50 次 CE 后中断) */
wrmsrl(IA32_MCx_CTL(i), 0x00000001);
wrmsrl(IA32_MCx_LCTL(i), CMCI_EN);
}
/* 中断处理 */
void intel_cmci_poll(struct timer_list *unused) {
unsigned long flags;
rdmsrl(IA32_MCi_STATUS(bank), status);
if (status & MCI_STATUS_VAL) {
if (mce_usable_address(&mce)) {
/* 触发 Page Offline 流程 */
mce_notify_irq();
}
}
}
七、rasdaemon:用户空间的 RAS 管家
rasdaemon 是 Linux 主流发行版默认安装的 RAS 守护进程,充当内核错误日志和用户处理之间的桥梁。
7.1 三大输入源
rasdaemon 输入:
1. 内核 trace event (/sys/kernel/debug/tracing/events/mce/)
— mce:mce_record
2. EDAC uevent (NETLINK_KOBJECT_UEVENT)
— mc_event,格式:MCUEV="count=1:type=ce:..."
3. AER error injection 和 aer_event
— PCIe 错误链路追踪
7.2 关键功能
- 错误解码:解析 MCA 错误码 → 人类可读的类型描述(如 "L1 Cache Read Error")
- DIMM 定位:根据 Bank/CS 编号关联到
/sys中的 DIMM 标签 - 计数器维护:按设备/总线/DIMM 维护运行计数
- 告警机制:当 CE 频率超过阈值时触发 dispatcher(SNMP/脚本触发页面退役)
- 事件记录:写入 SQLite 数据库 (
/var/lib/rasdaemon/ras-mc_event.db) 用于历史分析
7.3 ras-mc-ctl 实用工具
# 查看 DIMM 统计
ras-mc-ctl --error-count
# 输出示例:
mc0 csrow0 ch0: 3 CE, 0 UE
mc0 csrow0 ch0: DIMM_B1 ECC
# 显示错误详情
ras-mc-ctl --errors
# 注册/取消注册 DIMM
ras-mc-ctl --register-labels # 通知驱动映射位置
ras-mc-ctl --unregister-labels # 禁用映射
# 模拟注入(需加载 mce-inject)
ras-mc-ctl --status # 查看 RAS 子系统状态
八、实战案例一:企业级内存纠错告警平台
8.1 需求背景
某金融客户环境中,服务器在 3 个月内发生 17 次 DIMM 退化引发的 UE 宕机。需要在内核侧实现"提前 24 小时预测 DIMM 报废"的能力。
8.2 方案设计
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ EDAC │───▶│ rasdaemon│───▶│ SQLite │───▶│ Python │
│ sysfs │ │ uevent │ │ DB │ │ Analyzer │
└─────────┘ └──────────┘ └──────────┘ └──────────┘
│
┌──────┴──────┐
│ ML Model │ ← LSTM/DT
│ (sklearn) │
└──────┬──────┘
│
┌──────┴──────┐
│ 退役策略 │
│ - 热拔 │
│ - 冷备替换 │
│ - Pod 迁移 │
└─────────────┘
8.3 核心脚本:CE 趋势分析
#!/usr/bin/env python3
"""Dimm CE 趋势分析与退役决策"""
import sqlite3
import datetime
from collections import defaultdict
DB_PATH = '/var/lib/rasdaemon/ras-mc_event.db'
THRESHOLD_CE_PER_DAY = 100 # 日均 CE 超过则预警
THRESHOLD_GROWTH_RATE = 1.5 # 环比增长率触发退役
def analyze_dimm_risk(db_path=DB_PATH, days=7):
conn = sqlite3.connect(db_path)
cursor = conn.execute("""
SELECT dimm_name, module, mc, csrow, ch,
COUNT(*) as ce_count,
MIN(timestamp) as first_seen,
MAX(timestamp) as last_seen
FROM edac_errors
WHERE type = 'ce'
AND timestamp > datetime('now', '-{} days')
GROUP BY mc, csrow, ch
""".format(days))
dims = cursor.fetchall()
conn.close()
alerts = []
for dimm in dims:
mc, csrow, ch = dimm[2], dimm[3], dimm[4]
ce_count = dimm[5]
# 计算每日错误率
frequency = ce_count / days
if frequency > THRESHOLD_CE_PER_DAY:
alerts.append({
'location': f'mc{mc} csrow{csrow} ch{ch}',
'module_name': dimm[1],
'ce_per_day': frequency,
'action': 'SCHEDULE_RETIREMENT'
})
return alerts
if __name__ == '__main__':
alerts = analyze_dimm_risk()
for a in alerts:
print(f"[WARN] DIMM {a['location']} ({a['module_name']}): "
f"{a['ce_per_day']:.1f} CE/day → {a['action']}")
# 触发 Kubernetes Node 标注待退役
# kubectl label node $NODE dimm.risk=critical
8.4 结果与经验
部署后,该企业:
- 预测准确率:提前 24h 命中 83% UE 事件(LSTM 模型,特征含 CE 振幅、错误地址聚集度)
- 假阳性率:仅 4% 被错误标记为"待退役"的 DIMM(均为内存总线接触不良,清洁即可恢复)
- 自动化程度:结合 Kubernetes Node Taint 实现 Pod 自动迁移,UE 宕机率降低 91%
九、实战案例二:PCIe AER 链路故障恢复
9.1 场景:GPU 训练集群频繁掉卡
某客户 8 节点 A100 HGX 集群频繁出现 GPU 从 PCIe 拓扑中"消失"(lspci 查询不到)。排查发现是 PCIe 链路降级触发 AER UE,但内核未正确处理。
9.2 排查与调试
# 查看 PCIe 链路状态
lspci -vt
lspci -vvv -s <GFX_BDF> | grep -E "LnkCap|LnkSta|UESta|CESta"
# 读取 AER 寄存器
setpci -s <BDF> ECAP_AER+0x04.L # UESta
setpci -s <BDF> ECAP_AER+0x10.L # CESta
# 查看 AER 内核处理日志
dmesg | grep -E "(aer|AER)"
# 启用 AER 调试
echo "module aeripv = 0xFFFF" > /sys/module/pcieaer/parameters/aerdriver_log
9.3 根因分析
通过 EINJ 注入测试发现:
错误模式:
1. NVMe 控制器触发 TLP MALFORMED(畸形 TLP)
2. AER UESta 记录 "Uncorrectable Fatal Error"
3. PCI 设备断开重连
4. GPU 因共享 PCIe Switch 上端
根因:Switch 上行带宽争抢(来自 RDMA NIC 突发流量)导致 TLP 传输出错。
9.4 修复策略
# 1. 调整 PCIe AER 严重度,降低误杀
echo 0xFFFFFFFF > /sys/module/pcieaer/parameters/aer_firmware_first
# 2. 检查链路是否正常协商
lspci -vvv | grep "UESta"
# 3. 调整 NIC RDMA 流量突发大小(限制抢占带宽)
ethtool -C eth0 rx-usecs 50 tx-usecs 50
# 4. 持久修复:升级到支持 PCIe LTR(Latency Tolerance)报告的固件
修复后,AER TLP MALFORMED 下降至零,GPU 训练稳定性提升。
十、内核 RAS 子系统配置与优化
10.1 关键 sysctl 参数
# 启用内存页回收(针对 Poison Page)
sysctl -v hwpoison_page_release=1
# MCE 内核恐慌阈值(超过 X 次 MC 就 panic)
sysctl -v mce.panic_on_ue=1 # 始终 panic(生产安全)
sysctl -v mce.panic_on_ue=0 # 尝试恢复(可用性优先)
# 内存热插拔配合 RAS
sysctl -v memory_probe=1 # DIMM 在线检测
sysctl -v vm.memory_failure_early_kill=1 # 立即发送 SIGBUS
10.2 GRUB 参数调优
mce=confidence — 启用 CMCI 置信度检查(Haswell+)
mce=off — 完全禁用 MCE(仅调试用)
edac_report=force — 强制 EDAC 驱动接管(规避 Firmware First 导致的信息丢失)
nomce — 禁用 MCE 中断(KVM guest 用)
intel_idle.max_cstate=0 — 禁用 C-State(部分 USB/RAS 问题缓解)
10.3 KVM Guest RAS
虚拟化场景下,Guest OS 看到的 RAS 信息由 Hypervisor 虚拟化注入。
# 启用 MCE 注入(QEMU/KVM)
-machine mce=on -cpu host,mce
# Guest 通过 ACPI BERT 表读取 Firmware First 错误
# (需要 QEMU >= 7.2 + ACPI 6.5 支持)
关键限制:KVM guest 不能直接访问 host 物理 Bank 寄存器,依赖 Hypervisor 传递 snapshot。
十一、6.x 内核新演进与展望
11.1 RAS 扩展:CMCI 虚拟化
从 6.2 内核开始,CMCI 支持在 Guest 中虚拟化,使得 VMware/KVM 虚拟机可以直接看到 CE 趋势。这对云场景下预测 Guest DIMM 健康状况至关重要。
11.2 Intel TDX 与 SEV-SNP 下 RAS 隔离
机密计算(Confidential Computing)环境下,RAS 信息的可见性成为关键问题:
- 传统方案:Host 读取 Bank,对 Guest 透明,但违反 TEE 设计原则
- 6.7+ 内核:引入
TDX MDCF(Memory Device Convey Flooding),允许 Guest 在加密内存中读取自己的 RAS 计数
11.3 CXL 2.0 Type 3 RAS 集成
CXL Type 3(内存扩展器)的 RAS 处理是 6.4+ 内核热点:
CXL RAS 链路:
CXL.io (PCIe) → AER 处理
CXL.cache → Cache Protocol Error → 扩展 MCA bank
CXL.mem → Memory Error → EDAC driver (cxl_mem)
11.4 EDAC Rust 重写实验
2024 年 Linux 内核社区提议将 EDAC core 部分模块用 Rust 重写,解决长期困扰的 EDAC sysfs 竞态条件问题(如 edac_mc_del_mc 热拔除与中断的 race)。虽然仍处于 RFC 阶段,但标志着 RAS 子系统进入"内存安全"演进路线。
十二、调试工具箱速查
# ======== 硬件信息查看 ========
# 查看 MCA Bank 数
dmesg | grep -i mca
rdmsr 0x179 # IA32_MCG_CAP
# 读取特定 Bank 状态
mcelog --bank 0 # Legacy(现由 rasdaemon 替代)
# ======== EDAC 接口 ========
ls /sys/devices/system/edac/mc/
cat /sys/devices/system/edac/mc/mc*/ce_count
cat /sys/devices/system/edac/mc/mc*/ue_count
cat /sys/devices/system/edac/mc/mc*/csrow*/ch*/dimm_label
# ======== AER 调试 ========
# 查看 PCIe 设备 AER 能力
lspci -vvv | grep -A20 AER
# 注入 AER 错误
echo "0xD94" > /sys/bus/pci/devices/.../correctability
# ======== EINJ 测试 ========
ls /sys/kernel/debug/apei/einj/
# 内存 CE 注入
echo 0x1 > /sys/kernel/debug/apei/einj/error_type
# 内存 UE 注入
echo 0x2 > /sys/kernel/debug/apei/einj/error_type
# 触发
echo 1 > /sys/kernel/debug/apei/einj/error_inject
# ======== 内核 trace ========
# 查看 MCE 实时事件
cd /sys/kernel/debug/tracing/events/mce
echo 1 > enable
cat trace_pipe
# 查看 EDAC 实时事件
cd /sys/kernel/debug/tracing/events/edac
echo 1 > enable
# ======== Syzkaller 接口(Google 模糊测试) ========
syz-manager -config my.cfg \
-enable sys/linux/memory_failure \
-enable sys/linux/poison
结语
Linux RAS 子系统是一条隐形的生命线。对云计算服务商而言,每 1% 的 MCE 处理优化都意味着数百万美元的节省;对边缘计算和高性能计算场景,EDAC 驱动的 Page Offline 机制决定了系统的可用性边界。
随着 CXL 和机密计算的普及,RAS 子系统正面临新一轮重构:从"被动响应"到"主动预测",从"内核单一出口"到"多安全域可见"。本文仅是这一庞大领域的入门,但未覆盖的部分 —— 如 CXL.mem RAS、ARM SoC/IP 级 RAS(CMN-700 mesh 错误)、内核 CCIX 错误接口 —— 每一个都值得单独成文。
理解 RAS,你理解的是 Linux 在硬件面前"最后一道防线"。

发表评论 取消回复