前面的文章介紹了linux的中斷處理機制,而作業系統的中斷處理是和硬體的中斷控制器緊密相關的,本文將以arm這樣乙個具體的處理器為例,講解硬體層面對中斷的支援。
arm的中斷控制器被稱為gic(generic interrupt controller),最開始的v1版本最多支援8個pe和1020個中斷源(interrupt source),用於arm cortex-a5,a9等。這裡pe代表processing element,它是arm架構對處理單元的抽象,為方便理解,就把它當做arm cores好了。
v2版本增加了對虛擬化功能和trustzone的支援,用於arm cortex-a7,a15,a53,a57等。
v3版本對支援的arm cores數目和中斷源的數目都有所增加,並增加了msi(message-based interrupt)功能。
v4版本加入了對直接注入虛擬中斷的支援,v3和v4都可用於arm cortex-a53,a57,a72等。
本文接下來的敘述將以gic v3/v4為基準。gic的組成
中斷控制器是中斷源和cpu之間的橋梁,自從cpu進入多核時代以後,中斷控制器也慢慢地由單一的模組分化成了兩個部分,一部分是直接連線中斷源的,由所有的cpu共享,比如x86中的i/o apic,另一部分是對接cpu的,其數目通常就等於cpu的數目,比如x86中的local apic。
類似地,arm的gic也由distributer和redistributor兩部分構成,其中distributer類似於i/o apic,其發揮的作用顧名思義,就是根據cpu的配置,將到來的中斷源派發到cpu對應的redistributor。redistributor類似於local apic,它會將distributer派發來的中斷送到其連線的cpu。中斷源的分類
gic中斷源的編號從0開始,0到15是sgi(software generated interrupt),所謂"software generated",就是指由cpu直接寫對應的暫存器觸發中斷,因而這種中斷不是由硬體產生的,而是由軟體主動產生的。這種特殊的中斷主要用於核間通訊,類似於x86中的ipi(inter-processor interrupt)。
編號16到31是ppi(private peripheral interrupt),所謂"private",是指這個中斷為cpu私有/專用,那什麼中斷會有這種特性呢?比如通用定時器中斷啊,溫度感測器中斷啊。
sgi和ppi都是每個cpu各有乙份,不同cpu的同一種sgi/ppi共享同乙個編號,因而它們都屬於"banked"形式的中斷源。
與專有的ppi相對應的就是所有cpu全域性共享的spi(shared peripheral interrupt),編號從32到1020。
至於編號大於8192的lpi,就比較特殊了,它是從gicv3版本開始引入的,主要用於前面提到的message based的中斷(msi)。訊息(message)是作業系統中一種常用的通訊手段,硬體在中斷系統中引入類似的實現機制,相比於傳統的中斷可以實現更靈活的設計。lpi的中斷一定是msi形式的,而spi的中斷可以是msi,也可以不是。
為了支援msi的特性,其配置資訊不是放在暫存器中,而是放在一段特殊的記憶體中,這種記憶體通常被稱為pram(parameter ram),pram配置相比於暫存器配置的好處是可以根據需要更有效地利用儲存空間。
這種對中斷源的劃分是從gic輸入的角度進行的,而中斷經過gic(輸出)到達cpu之後,則只有irq(interrupt request)和fiq(fast interrupt request)兩種,其轉換規則有一些複雜,在此就不展開了。中斷源的優先順序
在gicv3中,有乙個running priority的概念,當乙個cpu不處理中斷時,它的running priority就等於代表最低優先順序的0xff,而當它開始應答某個中斷源後,該cpu的running priority就等於這個中斷源的優先順序。
引入running priority的目的主要是為了解決中斷搶占(preemption)的問題。假設不允許搶占,那麼在低優先順序的中斷處理期間,高優先順序的中斷將被阻塞。
而如果允許搶占,則高優先順序的中斷將被優先處理。
從軟體的角度,gic提供的這一硬體特性會導致中斷處理函式的巢狀,增加軟體的複雜度,因而同fiq一樣,通常並不被linux等作業系統作為常規的特性使用。
本文主要介紹了arm中斷控制器的構成和其對中斷源的分類。硬體提供特性,但作業系統不一定會支援,下文將結合linux核心的實際**,講解linux對arm中斷的處理過程。
參考:gicv3 and gicv4 software overview
arm中斷保護和恢復 ARM中斷異常處理的返回
舉個小例子,下面是一段arm彙編 0x3000bl add 0x3004mov r0,0 0x3008mov r1,1 0x300cmov r2,2 area test,code,readonly entry start mov r0,1 mov r1,1 bl add mov r0,0 mov r...
arm中斷保護和恢復 ARM中斷異常處理的返回
舉個小例子,下面是一段arm彙編 位址指令 0x3000 bl add 0x3004 mov r0,0 0x3008 mov r1,1 0x300c mov r2,2 area test,code,readonly entry start mov r0,1 mov r1,1 bl add mov r...
arm中斷保護和恢復 ARM異常中斷返回的幾種情況
重要基礎知識 r15 pc 總是指向 正在取指 的指令,而不是指向 正在執行 的指令或正在 解碼 的指令。一般來說,人們習慣性約定將 正在執行的指令作為參考點 稱之為當前第一條指令,因此 pc總是指向第三條指令。當 arm 狀態時,每條指令為 4 位元組長,所以 pc 始終指向該指令位址加 8 位元...