微信公众号 mindshare思享
NMI是Non Maskable Interrupt的缩写,它是一种不能mask的硬件中断,主要用于当一些不能恢复的硬件错误发生时发送信号给CPU。
NMI通常是用在当一般的中断被软件(比如OS)mask的情况下需要响应一些关键事件,比如报不能恢复的硬件错误(比如cache的parity和ECC错误),在一般中断被mask情况下的系统调试,处理如系统复位(复位按钮)这种特别的情形。
本文将介绍x86和arm中有无NMI和怎么来处理需要NMI的场景。
x86的NMI
NMI在x86构架上已经存在很长的时间(8086就已经有了)。一般的中断INTR会受到IF的影响,当IF=1时,INTR被屏蔽,而NMI不受到IF设置的影响,CPU都会响应。
Arm上的NMI?
Arm处理器上有没有NMI呢?这个需要分情况来说。
众所周知,现代的armCPU有Cortex-A/R/M序列处理器,Cortex-A为应用处理器,Cortex-R为实时处理器,Cortex-M为MCU处理器。
Cortex-M处理器
因为Cortex-M处理器用在MCU上,有的MCU用在非常关键的场景,比如火灾监测,它需要不管当时MCU在处理什么任务,一旦监测到火灾,必须立即报警和响应(喷水?)因此Cortex-M构架的CPU都有由NVIC支持的NMI,这个NMI是没有任何办法去mask的,即使在Cortex-M因为关键的错误进入了hard fault,甚至是lock up的状态,NMI也可以被响应。不管怎么设置PRIMASK,FAULTMASK都不能屏蔽NMI 。
Cortex-A/Cortex-R处理器
Cortex-A和Cortex-R处理器没有独立的NMI,但是Cortex-A和Cortex-R的中断处理有比较大的区别:Cortex-R需要中断响应的实时性,而Cortex-A处理器的中断实时性要求不是非常高,但是要支持安全扩展,虚拟化等特有的特性,需要对应的中断处理支持。
在Cortex-A和Cortex-R处理器中,有两个中断信号,IRQ, FIQ (对于支持虚拟化的Cortex-A处理器其实还有vIRQ, vFIQ信号,不是本文要阐述的)。
FIQ代表fast interrupt. FIQ在 arm的处理器里有很长的历史,早在armv4构架的arm7处理器已经存在,在armv8 64位构架之前还有与之对应的FIQ处理器模式。
FIQ之所以fast体现在以下方面:
1. FIQ和IRQ同时发生时,FIQ有更高的优先级,先被处理。
2. 在处理IRQ时如果FIQ没有被mask, FIQ可以抢占IRQ异常处理过程。
3. 在发生IRQ异常,做IRQ异常处理过程中,CPU HW自动mask IRQ, 但是不mask FIQ.
FIQ有额外的bank寄存器,减少软件需要保护的寄存器,加快FIQ处理。
但是FIQ不是真正意义上的NMI,因为它可以被软件mask。通过设置CPSR.FIQ bit就可以(引入安全扩展和虚拟化扩展之外情况有点复杂,暂时不表)。
在Cortex-R上对FIQ有特殊的处理,可以通过绑定CFGNMFI输入信号将FIQ变成真正意义上的NMI。
但是在Cortex-A处理器的时代,FIQ用作fast interrupt的场景并不多,默认的Linux kernel也并不使用FIQ. 主要是Cortex-A 处理器用在手机,平板电脑中,对中断的实时性要求不是很高,当然还是有sysrq的kernel调试的需求(后面会讲到)。
所以实际上FIQ被“挪用”到另一种使用场景中:用来支持Trustzone,区分安全和非安全中断, 这需要中断控制器GIC和CPU的通力合作,以GICv2为例:
1. 配置GIC通过FIQ发送安全中断给CPU,通过IRQ发送非安全中断给CPU。
2. 配置CPU在secure state时trap IRQ(非安全中断)到secure monitor;在non secure state是trap FIQ(安全中断)到secure monitor.
到了armv8-a的aarch64中,做的更彻底,干脆就没有了FIQ处理器状态,上面1-4的特性也没有了,只是徒有其名-FIQ.
为什么要在和大家在讲NMI的主题里和大家讲这个呢?主要是这会影响到在arm里怎么模拟NMI.
但是随着近年arm进入到服务器和PC市场,对NMI的需求越来越强(包括对RAS error的处理)。arm怎么在没有物理NMI的场景下支持NMI的特性呢?
以下内容会谈到:
1. NMI的使用场景。
2. 在arm上怎么模拟NMI
a. 通过GIC的中断优先级模拟
b. 通过SDEI接口模拟
首先我们来说一下NMI的使用场景。
用作debug手段
在x86上,很久以前就使用NMI来作为调试手段:
· 早期的PC 用它来报如内存出错这样的硬件问题
· 现代的服务器在前面板上有一个物理的NMI按钮
· 看门狗中断可以发送到NMI, 进而得到系统出现问题(比如hard lock,检测在中断禁止情况下的deadlock)的现场信息,而不是仅仅重启。
· performance counter 可以直接挂到local APIC上。
未完待续