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,否則傳回對應錯誤的負值。