1.簡介:
PCIe中斷支持三種傳輸方式:
? ? ? ? ? Legacy: 也稱傳統中斷,Legacy PCI中斷機制,每個PCI設備最多支持四個中斷信號(邊帶信號:INTA# INTB# INTC# INTD#)
? ? ? ? ? MSI(Message Signaled Interrupt): Post Memory Write,只支持32個中斷向量
? ? ? ? ? MSI-x: MSI的升級,最多支持2048個中斷向量
2.傳統中斷
1. PCI設備通過INTx邊帶信號產生中斷請求,經過中斷控制器后轉換為INTR信號,并直接發送至CPU
2. CPU收到INTR信號置位后,知道了中斷請求的發生,但其并不知道是什么中斷請求,因此CPU通過中斷應答來查詢中斷請求信息
3. 中斷應答被發送至PIC后,PIC會返回一個8bits的中斷向量值給CPU
4. CPU收到中斷向量值后,去Memory中的中斷向量表中查找對應的中斷服務程序在memory的位置
5. CPU讀取ISR程序,然后處理該中斷
1. 配置空間Command Register的bit10可禁止/使能INTx中斷;但不會影響MSI&MSI-x
2. 配置空間Status Register的bit3表示中斷狀態
3. 配置空間Interrupt Pin定義中斷邊帶信號引腳號
4. 配置空間Interrupt Line定義中斷向量號
?
MSI本質上是一種Memory Write. MSI相關的寄存器存在于配置空間前256Bytes中.支持32個中斷向量。
3.MSI中斷
MSI本質上是一種Memory Write. MSI相關的寄存器存在于配置空間前256Bytes中.支持32個中斷向量。
? ?? Capability ID:只讀,05h表示支持MSI功能
? ? ? ? ? Next Capability Pointer:只讀,用于查找下一個Capability structer的位置,值為00h則表示到達Linked list的最后.
? ? ? ? ? Message Control Register:用于確定MSI的格式與支持的功能等信息
? ? ? ? ? Mask Bits:中斷屏蔽位,可屏蔽對應MSI信息的發送
? ? ? ? ? Pending Bits:相關中斷未屏蔽時,發生了相關中斷,對應的bit置位,一旦該中斷被發出,該位立即清零
?
4.MSI-x
MSI-x是MSI的改進,本質上也是一種Memory Write.?支持2048個中斷向量,占用更少的配置空間.中斷向量信息被存儲在特殊的Memory(MMIO)中,該memory指向Table BIR(Base address Indicator Register)
5.區別
傳統中斷在PCIe中也是基于消息的,那么那他與MSI中斷的區別是什么呢
其一,共享中斷帶來的性能損失:
傳統中斷的中斷引腳常常被多個設備共享. 當中斷觸發時, 內核必須依次觸發每個設備相應的中斷處理,這必將損失系統的整體性能.??每個MSI中斷屬于設備所獨有,因此不會產生共享中斷帶來的性能損失。
??
其二,傳統中斷超前產生,實際數據并未真正達到:
眾所周之,中斷通常是設備發送完數據后,給CPU一個中斷通知CPU進行處理。但是這種看似簡單的應用如果是傳統中斷也會產生問題,那就是,中斷已經產生,并且數據也已經從設備發出,但是實際上并沒有到達主存。這時候CPU是讀不到它想要的數據的。在這種情況下,CPU必須從設備端讀取寄存器來知道數據是否真的已經到達目的地,PCI事物排序規則確保該寄存器只有在數據真實到達之前才會更新。這是傳統中斷的另一弊端,而MSI中斷因為與數據包共享同一通路并且有嚴格的先后順序,所以不會出現這種問題,更不需要更新和查詢設備端寄存器,從而節省了很多開銷。
其三,每個設備最多只有四個傳統中斷引腳:
對于多功能PCI設備而言,每一個功能最多只有一個中斷引腳。設備驅動程序必須查詢設備產生的具體事件,勢必降低中斷處理速度。而一個設備可以支持最多32個MSI中斷,每個中斷有其特定功能,譬如,一些一場情況和錯誤處理有其單獨的中斷能讓驅動程序處理如數據收發中斷更有效。