Machine Check Exception (MCE) 是CPU发现硬件错误时触发的异常(exception),中断号是18,异常的类型是abort:

导致MCE的原因主要有:总线故障、内存ECC校验错、cache错误、TLB错误、内部时钟错误,等等。不仅硬件故障会引起MCE,不恰当的BIOS配置、firmware bug、软件bug也有可能引起MCE。

在 Linux 系统上,如果发生的MCE错误属于可以自动纠正的类型,那么系统保持继续运行,MCE错误日志会记录在一个ring buffer中(这个ring buffer通过设备文件/dev/mcelog来访问),用 mcelog(8) 命令可以读取MCE日志,系统通常会通过cron任务或者mcelog.service把ring buffer中的MCE日志写入/var/log/mcelog文件中。如果发生的MCE错误属于无法恢复的类型,那么系统会panic,错误信息会输出在终端上和message buffer里。

分析MCE需要参考Intel手册第3卷,15章Machine-Check Architecture和16章Interpreting Machine-Check Error Codes。由于MCE在不同型号的CPU上有差异,解读的方法也有不同,第16章是专门解释在不同的CPU型号上如何解读MCE错误码。

每个CPU上有一组寄存器称为 Machine-Check MSR (Model-Specific Register),用于Machine-Check的控制与记录,分为全局寄存器和若干Bank寄存器(CPU的硬件单元分成若干组,每一组称为一个Bank)。当发生MCE时,错误信息记录在全局状态寄存器 MCG_STATUS MSR 和Bank寄存器 MCi_STATUS MSR 中,如下图黄色框所示:

分析MCE的方法,就是根据Intel手册解读上述寄存器中记录的错误信息。Linux内核把MCE的信息保存在下面的结构体中:

/arch/x86/include/asm/mce.h :

0067 struct mce {

0068 __u64 status; /* 对应 IA32_MCi_STATUS MSR */

0069 __u64 misc;

0070 __u64 addr;

0071 __u64 mcgstatus;/*对应 IA32_MCG_STATUS MSR */

0072 __u64 ip;

0073 __u64 tsc; /* cpu time stamp counter */

0074 __u64 time; /* wall time_t when error was detected */

0075 __u8 cpuvendor; /* cpu vendor as encoded in system.h */

0076 __u8 inject_flags; /* software inject flags */

0077 __u16 pad;

0078 __u32 cpuid; /* CPUID 1 EAX */

0079 __u8 cs; /* code segment */

0080 __u8 bank; /* machine check bank */

0081 __u8 cpu; /* cpu number; obsolete; use extcpu now */

0082 __u8 finished; /* entry is valid */

0083 __u32 extcpu; /* linux cpu number that detected the error */

0084 __u32 socketid; /* CPU socket ID */

0085 __u32 apicid; /* CPU initial apic ID */

0086 __u64 mcgcap; /* MCGCAP MSR: machine check capabilities of CPU */

0087 };

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/arch/x86/include/asm/mce.h:

0067structmce{

0068__u64status;/* 对应 IA32_MCi_STATUS MSR */

0069__u64misc;

0070__u64addr;

0071__u64mcgstatus;/*对应 IA32_MCG_STATUS MSR */

0072__u64ip;

0073__u64tsc;/* cpu time stamp counter */

0074__u64time;/* wall time_t when error was detected */

0075__u8cpuvendor;/* cpu vendor as encoded in system.h */

0076__u8inject_flags;/* software inject flags */

0077__u16pad;

0078__u32cpuid;/* CPUID 1 EAX */

0079__u8cs;/* code segment */

0080__u8bank;/* machine check bank */

0081__u8cpu;/* cpu number; obsolete; use extcpu now */

0082__u8finished;/* entry is valid */

0083__u32extcpu;/* linux cpu number that detected the error */

0084__u32socketid;/* CPU socket ID */

0085__u32apicid;/* CPU initial apic ID */

0086__u64mcgcap;/* MCGCAP MSR: machine check capabilities of CPU */

0087};

下面的MCE错误信息截取自一台因MCE而crash的机器,我们以此为例来解读一下MCE信息。

注:产生以下信息的内核函数是:

static void print_mce(struct mce *m)

源程序:arch/x86/kernel/cpu/mcheck/mce.c

如果需要的话,阅读源程序可以理解输出的信息与原始数据的对应关系。

[Hardware Error]: CPU 3: Machine Check Exception: 4 Bank 5: be00000000800400

[Hardware Error]: TSC 128727f47a97 ADDR 3f628bd69349 MISC 1

[Hardware Error]: PROCESSOR 0:106a5 TIME 1450279905 SOCKET 1 APIC 14

[Hardware Error]: Machine check: Processor context corrupt

Kernel panic - not syncing: Fatal Machine check

1

2

3

4

5

[HardwareError]:CPU3:MachineCheckException:4Bank5:be00000000800400

[HardwareError]:TSC128727f47a97ADDR3f628bd69349MISC1

[HardwareError]:PROCESSOR0:106a5TIME1450279905SOCKET1APIC14

[HardwareError]:Machinecheck:Processorcontextcorrupt

Kernelpanic-notsyncing:FatalMachinecheck

其中CPU和Bank是MCE的接收者:

CPU 3 – 表示检测到MCE错误的是3号CPU,对应struct mce的extcpu字段;

Bank 5 – 一组硬件单元称为一个bank,每个bank对应一组machine-check寄存器;

MCE的错误代码包括两部分:

Machine Check Exception: 4 – 表示 IA32_MCG_STATUS MSR寄存器的状态码是4(含义见后文),对应 mcgstatus字段;

be00000000800400 – 表示 IA32_MCi_STATUS MSR寄存器中的错误码(含义见后文),对应status字段。

Machine Check Excheption: 4 的含义

它来自全局状态寄存器 IA32_MCG_STATUS MSR,(对应struct mce的 mcgstatus字段),只用到三个bit,如下所示。4表示machine-check in progress。

Bit 0: Restart IP Valid. 表示程序的执行是否可以在被异常中断的指令处重新开始。

Bit 1: Error IP Valid. 表示被中断的指令是否与MCE错误直接相关。

Bit 2: Machine Check In Progress. 表示 machine check 正在进行中。

be00000000800400 的含义

它来自bank寄存器IA32_MCi_STATUS MSR,(对应struct mce的status字段)。

be00000000800400 的二进制位如下:

Bit 63: VAL. 表示本寄存器中包含有效的错误码

Bit 61: UC. 表示是无法纠正的MCE

Bit 60: EN. 表示处于允许报告错误的状态

Bit 59: MISCV. 表示MCi_MISC寄存器中含有对该错误的补充信息

Bit 58: ADDRV. 表示MCi_ADDR寄存器含有发生错误的内存地址

Bit 57: PCC. 表示该CPU的上下文状态已被该错误破坏,无法恢复软件代码的运行

Bits [16:31] 包含特定CPU型号相关的扩展错误码. 本例中是0x0080.

Bits [0:15] 包含MCE错误码,该错误码是所有CPU型号通用的,分为两类:simple error codes(简单错误码) 和 compound error codes(复合错误码),本例中0x0400表示Internal timer error:

– Simple Error Codes:

0000 0000 0000 0000 – 没有错误.

0000 0000 0000 0001 – Unclassified. 未分类的错误类型.

0000 0000 0000 0010 – ROM微码校验错

0000 0000 0000 0011 – MCE是由于别的CPU的BINT# 引起的.

0000 0000 0000 0100 – Functional redundancy check (FRC) master/slave error.

0000 0000 0000 0101 – Internal parity error.

0000 0100 0000 0000 – Internal timer error.

0000 01xx xxxx xxxx – Internal unclassified error. 至少有一个x等于1

– Compound Error Codes:

000F 0000 0000 11LL – Generic cache hierarchy errors.

000F 0000 0001 TTLL – TLB errors.

000F 0000 1MMM CCCC – Memory controller errors (Intel-only).

000F 0001 RRRR TTLL – Memory errors in the cache hierarchy.

000F 1PPT RRRR IILL – Bus and interconnect errors.

下一步,由于Bits [16:31] 是非零值0x0080,包含的是特定CPU型号相关的扩展错误码,我们要参考Intel手册第三卷第16章。首先确定CPU型号,我们需要的是CPU faimily和model,从/proc/cpuinfo中可以找到:

# less /proc/cpuinfo

...

processor : 3

vendor_id : GenuineIntel

cpu family : 6

model : 26

model name : Intel(R) Xeon(R) CPU L5520 @ 2.27GHz

stepping : 5

cpu MHz : 2266.700

cache size : 8192 KB

physical id : 1

siblings : 8

core id : 2

cpu cores : 4

apicid : 20

...

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# less /proc/cpuinfo

...

processor:3

vendor_id:GenuineIntel

cpufamily:6

model:26

modelname:Intel(R)Xeon(R)CPUL5520@2.27GHz

stepping:5

cpuMHz:2266.700

cachesize:8192KB

physicalid:1

siblings:8

coreid:2

cpucores:4

apicid:20

...

根据cpu family/model,即06_1AH,找到Intel手册中对应的章节,但是没找到匹配Internal timer error和0x0080的条目。所以只能到此为止了。

总结我们的发现:

CPU 3 发现了无法纠正的MCE,是Internal timer error,被中断的指令与MCE不相关,被中断的程序指令不能恢复运行,CPU的上下文已被MCE破坏。

怎样禁用MCE

可以在 /boot/grub/grub.conf 中加入以下内容:mce=off。

还有其它的MCE选项,比如禁用CMCI(Corrected Machine Check Interrupt),或者禁用MCE日志,等等,例如:

mce=off  — Disable machine check

mce=no_cmci  — Disable CMCI(Corrected Machine Check Interrupt)

参见文档:Documentation/x86/x86_64/boot-options.txt

每个 CPU 都有一个sysfs接口:

/sys/devices/system/machinecheck/machinecheckN

注:(N = CPU number)

其中包含的可调参数参见:Documentation/x86/x86_64/machinecheck

crash linux主要命令,crash分析相关推荐

  1. crash linux主要命令,kdump和crash的配置方法以及故障分析方法

    Linux的内核十分稳定,但仍不可避免会遇到崩溃的情况,获取内核崩溃时的内存镜像,有助于分析系统在崩溃前发生了什么,分析原因并修复错误,进而进一步提升系统的稳定性. [正文] 一   kdump简介 ...

  2. Linux netstat命令结果分析

    一:获取数据 使用命令 netstat -anp  //命令介绍: netstat : linux中查看网络状态的命令 -a : 显示所有的连接 -n : 以ip格式显示 -p : 显示连接对应的进程 ...

  3. linux diff命令_Linux diff命令示例

    linux diff命令 The Linux diff command analyses a file line by line and gives an output of a list of ch ...

  4. Linux系统设置命令大全

    1.reset命令 Linux reset命令其实和 tset 是一同个命令,它的用途是设定终端机的状态.一般而言,这个命令会自动的从环境变数.命令列或是其它的组态档决定目前终端机的型态.如果指定型态 ...

  5. Python3 Linux相关命令大全

    1.文件管理相关 cat cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上. https://www.runoob.com/linux/linux-comm-cat.h ...

  6. 在Linux执行命令报错”Arg list too long”的原因分析

    http://www.yunweipai.com/archives/558.html 在Linux执行命令报错"Arg list too long"的原因分析 吞拿鱼手卷 于 3 ...

  7. Linux作业 使用make命令和分析makefile文件

    使用make命令和分析makefile文件   diction是一个经典的Unix小工具,用来检测使用不当的英文短语.   请前往 http://www.gnu.org/software/dictio ...

  8. linux帐户管理命令和文件分析

     linux帐户管理命令 1.创建用户 新的用户可以使用useradd命令创建 2.创建组 增加一个新用户组可以使用 groupadd命令. 格式: groupadd  选项  用户组 常用的选项: ...

  9. Linux书签(02)用linux top命令自行监测和分析服务器CPU、内存、进程等性能

    楔子: 学会灵活使用各种或工具或手段来监测自己的项目运行情况无疑是一种自我能力的提高.Linux top 命令也许会有所帮助. Linux top 命令 Linux top 命令是服务器工程师和运维最 ...

最新文章

  1. MySQL长途售票系统_PHP+MySQL长途客用汽车票订票系统的设计与实现
  2. linq之Capacity(转载)
  3. 通过修改Tomcat配置,解决乱码问题
  4. Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略
  5. ACL 2021 | Glancing Transformer:惊鸿一瞥的并行生成模型
  6. OpenGL 着色器的N体仿真
  7. 迷你linux设备,ComputeLab发布MintBox迷你PC:专为Linux系统玩家打造
  8. 前端全栈大佬是如何使用javaScript实现一个无缝轮播
  9. python将学生信息保存到文件中_Python statsmodels OLS:如何将学习的模型保存到文件中...
  10. IDEA 2020 配置 Maven 创建 Spring Boot 项目
  11. 电子技术基础(数字部分)(第六版) 康华光 课后习题答案
  12. 怎么用linux给苹果手机降级,如何查询iOS可降级版本?苹果iOS随意降级工具或即将到来...
  13. 2019春第九周作业
  14. 布尔教育mysql优化_布尔教育-资源
  15. 2022-2028全球2,5-二甲基呋喃(DMF)行业调研及趋势分析报告
  16. 牛客 游戏(概率DP)
  17. 我国土地资源开发利用中存在的主要问题
  18. 关于JAVA实现二维码以及添加二维码LOGO
  19. C语言基础:预处理指令
  20. windows环境下tomcat实现日志切割

热门文章

  1. 分享一下身边朋友自学android开发及找工作的那些事!【不足勿喷】
  2. yolox的正负样本分配策略mmdet代码详解
  3. cvm服务器虚拟化,云服务器cvm简单高效便于处理能力提升
  4. linux smit工具,linux安全基础 SMIT入门(4)
  5. 【正点原子STM32连载】第五十一章 视频播放器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  6. 将人像照做成旋转风车效果!超实用Photoshop教程
  7. 吉林大学软件学院——UML作业1
  8. Online Meetup DevOps World 社区议程和 CFP
  9. SD2.0大会上关于“大型网站架构技术”的讨论(笔记)
  10. python遇到的问题及解决方法