處理器間中斷允許一個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 |
【作者】張昺華
【新浪微網誌】 張昺華--sky
【微信公衆号】 張昺華
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.