1. 程式人生 > >NMI,FIQ 與arm構架那點事-(1)

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

 

未完待續