NMI,FIQ 与arm构架那点事-(1)

微信公众号 mindshare思享

NMI是Non Maskable Interrupt的缩写,它是一种不能mask的硬件中断,主要用于当一些不能恢复的硬件错误发生时发送信号给CPU。

NMI通常是用在当一般的中断被软件(比如OS)mask的情况下需要响应一些关键事件,比如报不能恢复的硬件错误(比如cache的parity和ECC错误),在一般中断被mask情况下的系统调试,处理如系统复位(复位按钮)这种特别的情形。

本文将介绍x86和arm中有无NMI和怎么来处理需要NMI的场景。

x86NMI

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上。

未完待续

猜你喜欢

转载自blog.csdn.net/weixin_39366778/article/details/82662664
今日推荐