天天看點

linux中斷

    INT-中斷

按照CPU與中斷源(把能夠提出中斷請求的裝置和事件稱為中斷源)的位置關系可分為

内部中斷和外部中斷。

内部中斷:也稱為異常中斷,屬于非屏蔽中斷,是處理器檢測到異常情況或執行軟體

中斷指令引起的一種中斷。通常有:除法出錯中斷(INT0)、斷點中斷(INT3)、

溢出中斷(INT4)和單步執行中斷(INT1)等。異常又分為故障和陷阱。

外部中斷:也稱為硬體中斷,是由CPU外部引腳觸發的一種中斷,

分為不可屏蔽中斷NMI(INT2)和可屏蔽中斷INTR。

中斷源的優先權級别

内部中斷最高(除單步執行中斷),其次為NMI中斷,再次為INTR中斷。單步執行中斷最低

中斷響應

CPU在每條指令執行結束之後,都會去查詢有無中斷申請。

    PIC-可程式設計中斷控制器

PIC(programming interrupt controller),8259可程式設計中斷控制晶片可以管理8個中斷源,

通過級聯可以構成64個中斷向量系統

工作過程:當PIC向cpu處理器的INT引腳發送一個中斷信号時候,處理器停下所做事情

詢問PIC需要執行那個服務請求,PIC發送終端号,查詢中斷向量表,執行中斷服務程式

原理:8259A晶片可以處于程式設計狀态和操作狀态,cpu可以通過IN/OUT指令對晶片

進行初始化程式設計,還可以通過操作字指令修改中斷處理方式,完成了初始化程式設計,

晶片即進入操作狀态,此時晶片即可随時響應外部裝置提出的中斷請求

    多CPU架構演進

Symmetric Multi-Processor

SMP架構是隻多個cpu無主次,共享記憶體,總線,作業系統等,每個cpu通路記憶體任何位址

耗費時間相等,也稱為一緻存儲器通路結構

AMP架構是多個cpu分别做不同的事情,互不幹涉

Non-Uniform Memory Access

NUMA架構是非一緻存儲通路結構,多個SMP通過交換矩陣進行互聯,每個SMP有自己的記憶體,

同時還可以通路其他SMP的記憶體,但是要經過交換矩陣降低了速度,可以看出NUMA通過犧牲

記憶體的通路延時來達到更高的擴充性;缺點是CPU數量增加,通路遠端記憶體的時延也會增加,

性能不能線性增加

Massive Parallel Processing

MPP就是将多台獨立的主機組成叢集,每個節點都有自己的cpu、記憶體、作業系統,

軟體架構改變,完全松耦合,

    APIC-進階可程式設計中斷控制器

pin:引腳;vector:提供優先級和親和性綁定

在PIC和單核時代,irq,vector,pin是三合一的,就是PIC控制器的pin引腳,irq暗示

中斷優先級。進入多核時代帶來了很多問題,哪個中斷在哪個核上處理,如何保證中斷

負責均衡等。

IRQ是所有核統一編碼不重複,是中斷相關資訊的查詢碼,可以得到中斷控制器對象mpic

中斷描述符對象desc,硬體終端号等。

8259A隻适合單cpu的情況,對于SMP多cpu體系的并行,能夠把中斷傳遞給系統每個cpu

非常重要的。apic包括兩個元件:本地apic和io apic,系統最多有8個io apic負責收集

來自外部io的interrupt信号,然後按照一定規則發給loccal apic

可以調用Linux自己的優化子產品irqbalance來實作自動的優化調節,

1. 清除統計

2. 分析中斷的情況

3. 分析中斷的負載情況

4. 根據負載情況計算如何平衡中斷

5. 實施中斷親和性變更

也可以人為的将中斷進行綁定的固定的實體CPU上,中斷親和力是指将一個或多個中斷源

綁定到特定的 CPU 上運作,一旦設定了親和性,中斷就隻在特定的CPU上觸發了

指令主要用于多CPU環境下,它顯示各個可用CPU的狀态

    MSI/MSI-X Message Signaled Interrupt

沒有多根獨立的中斷PIN,它使用特殊的信号來模拟中斷PIN的置位和複位

MSI允許裝置向一段指定的MMIO位址空間寫一小段資料,然後chipset以此産生相應的中斷給CPU

PCI-E 的新标準,雖然MSI相對比較複雜一點,但它是有不少好處的:

利用寫寄存器值來觸發中斷,MSI使用了MSI Capability結構來實作中斷請求

MSI允許每個device有1,2,4,8,16或者是32個中斷

北橋被用來處理高速信号,通常處理CPU(處理器),RAM(記憶體),AGP端口或PCI Express,和南橋晶片之間的通信

南橋晶片負責I/O總線之間的通信,如PCI總線、USB、LAN、ATA

    軟中斷是soft irq

驅動中的硬中斷可能需要完成跟多工作,這時是關閉了中斷的,可能丢失外部中斷

是以linux架構,将中斷處理函數分為兩個任務,一個在中斷函數中執行,一個在軟體中斷

中執行,這時開啟中斷,可以相應外部中斷

硬體中斷處理完成後,在irq_exit中會觸發軟體中斷的處理,需要滿足兩個條件:

不是在硬體或軟體中斷處理過程中,必須有軟體中斷是pending狀态

preempt_count可以表示是否處于中斷處理或者軟體中斷處理過程中

避免軟體中斷在中斷嵌套中被調用,并且達到在單個CPU上軟體中斷不能被重入的目的

軟中斷避免中斷過程操作多丢失中斷,還要考慮時間長影響系統響應,又必須考慮優先度

__do_softirq函數就恰似在這三者之間打太極

為每個CPU啟動一個核心線程(watchdog/x),此線程為優先級最高的實時線程,在該線程得到排程時,

會更新相應的計數(時間戳),同時會啟動定時器,當定時器到期時檢查相應的時間戳,

如果超過指定時間,都沒有更新,則說明這段時間内都沒有發生排程(因為此線程優先級最高),

則列印相應告警或根據配置可以進入panic流程,echo 30 > /proc/sys/kernel/watchdog_thresh 

光子產品中斷不觸發問題:

拔出光子產品沒有任何顯示,經過判斷

ixgbe_service_task        是一個timer執行

ixgbe_check_sfp_event    是在ixgbe_msix_other被調用

注冊中斷處理程式 是通過request_irq函數來完成的

err = request_irq(adapter->msix_entries[vector].vector,

              ixgbe_msix_other, 0, netdev->name, adapter);

參數1:中斷号,所申請的中斷向量,比如EXIT0中斷等定義在mach/irqs.h。

參數2:是一個函數指針,向系統登記的中斷處理函數,是一個回調函數,當中斷發生時,系統調用這個函數。

參數3:指定中斷屬性、中斷觸發方式(一般用宏定義表示)等。定義在linux/interrupt.h。

參數4:指定中斷名字,用指令 cat /proc/interrupts 可檢視系統中斷申請與使用情況。

參數5:傳入中斷處理程式的參數,可以為NULL,但在注冊共享中斷時,此參數不能為NULL。該參數可作為共享中斷時的中斷差別參數,還可以把其傳給一個結構體變量,用于儲存一個裝置的資訊,使中斷處理函數可以獲得該裝置的資訊。

傳回值:函數運作正常時傳回0,否則傳回對應錯誤的負值。

繼續閱讀