處理器間中斷處理(IPI)【轉】


轉自:https://blog.csdn.net/fishmai/article/details/99593954

處理器間中斷允許一個CPU向系統其他的CPU發送中斷信號,處理器間中斷(IPI)不是通過IRQ線傳輸的,而是作為信號直接放在連接所有CPU本地APIC的總線上。在多處理器系統上,Linux定義了下列三種處理器間中斷:

CALL_FUNCTION_VECTOR (向量0xfb

發往所有的CPU,但不包括發送者,強制這些CPU運行發送者傳遞過來的函數,相應的中斷處理程序叫做call_function_interrupt(),例如,地址存放在群居變量call_data中來傳遞的函數,可能強制其他所有的CPU都停止,也可能強制它們設置內存類型范圍寄存器的內容。通常,這種中斷發往所有的CPU,但通過smp_call_function()執行調用函數的CPU除外。

RESCHEDULE_VECTOR (向量0xfc

當一個CPU接收這種類型的中斷時,相應的處理程序限定自己來應答中斷,當從中斷返回時,所有的重新調度都自動運行。

INVALIDATE_TLB_VECTOR (向量0xfd

發往所有的CPU,但不包括發送者,強制它們的轉換后援緩沖器TLB變為無效。相應的處理程序刷新處理器的某些TLB表項。


處理器間中斷處理程序的匯編語言代碼是由BUILD_INTERRUPT宏產生的,它保存寄存器,從棧頂押入向量號減256的值,然后調用高級C函數,其名字就是第幾處理程序的名字加前綴smp_,例如CALL_FUNCTION_VECTOR類型的處理器間中斷的低級處理程序時call_function_interrupt(),它調用名為smp_call_function_interrupt()的高級處理程序,每個高級處理程序應答本地APIC上的處理器間中斷,然后執行由中斷觸發的特定操作。

Linux有一組函數使得發生處理器間中斷變為一件容易的事:

函數 說明
send_IPI_all() 發送一個IPI到所有CPU,包括發送者
send_IPI_allbutself() 發送一個IPI到所有CPU,不包括發送者
send_IPI_self() 發送一個IPI到發送者的CPU
send_IPI_mask() 發送一個IPI到位掩碼指定的一組CPU


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM