1. 背景描述
Linux内核通过多种机制实现RAS功能,包括硬件错误检测、错误处理与恢复、以及错误日志记录等。本文以4.19内核x86版本为基础,详细分析Linux内核中的硬件RAS故障处理流程,涵盖从错误检测到错误恢复的全过程。
2. 故障产生
硬件RAS故障,如CPU、内存、PCIE等硬件故障,通常由于制造缺陷、过热、电压不稳、物理损坏、位翻转、ECC失效等原因导致。
根据故障类型是否可修复,通常又分为CE(可修复)故障和UE(不可修复)故障。
3. 故障上报
硬件在检测到故障后,如果发现是CE故障,则自动进行修复处理,并通过中断上报给内核进行事件记录;如果发现是UE故障,则直接上报给内核处理,内核再根据故障的严重程度,采取对应的如隔离、复位等处理策略。
注:这里为了流程清晰,有意忽略了BMC对于故障处理的影响。
因此无论是哪种故障类型,最终都会通过中断的方式上报给内核,而x86上常见的故障处理中断包括:
Ø MCE_VECTOR:MCE中断
其中MCE指Machine Check Exception,是x86 MCA机制在检测到硬件错误时触发的一种中断,支持检测CPU、内存、总线、缓存等硬件故障。
MCA将硬件错误分为多个Bank,每个Bank对应一类硬件组件(如CPU、内存、总线等),并包含一组寄存器用于记录错误的详细信息。
MCE中断处理上下文,可通过读取MCA记录的这些错误寄存器,感知产生硬件故障的具体原因,并执行相应的处理动作。
Ø DEFERRED_ERROR_VECTOR:延迟中断
该中断是AMD芯片特有处理流程,当MCA机制检测到低级别硬件故障时,可能会先将错误信息记录到MCA Bank寄存器,再延后到合适的时机上报中断并处理,中断上报时机可由操作系统通过MCA配置寄存器控制。
Ø THRESHOLD_APIC_VECTOR:阈值中断
用于当硬件错误次数达到一定阈值时再触发中断处理,通常用于处理硬件CE故障,其故障信息同样保存在MCA的Bank寄存器。
Ø THERMAL_APIC_VECTOR:温度中断
专门用于处理温度相关的中断事件,例如用于是实现cpu的过热保护机制等。
Ø ERROR_APIC_VECTOR:错误中断
用于处理APIC内部的错误处理中断,例如中断投递失败等。
Ø devm_request_threaded_irq(dev->irq,aer_irq, aer_isr):AER中断
用于处理PCIE相关的AER故障中断。
图3.1硬件故障中断上报流程
4. 故障处理
4.1. MCE中断
4.1.1. MCE处理流程
图4.1.1 MCE故障处理流程
4.1.2. MCE修复流程
图4.1.2 MCE故障修复流程