2012-04-29 121 views
0

上週講師講述瞭如何處理linux中的中斷,特別是do_IRQ函數。我想知道爲什麼do_IRQ函數從寄存器而不是從堆棧讀取它的參數。但導師也不知道這個原因。現在我仍然想知道爲什麼像do_IRQ這樣的內核函數從寄存器中而不是從堆棧中讀取所需的參數。我GOOGLE了,但我只發現功能從寄存器或堆棧讀取其參數,但不是原因。從寄存器讀取參數而不是從堆棧中讀取參數

+0

有一個谷歌的「調用約定」 – blueshift

+0

請問在調用約定和寄存器堆棧幀的IRQ函數的可用性之間有混淆嗎? – stsquad

回答

0

從內核2.6開始,所有內核函數都使用寄存器而不是堆棧來傳遞前3個參數(x86_64中的6)。
在古老的2.4內核中,只有少數性能至關重要的函數(如do_IRQ)以這種方式工作。你的老師教你關於2.4內核嗎?!

在寄存器中傳遞參數可提高性能。
與內存相比,讀取/寫入寄存器要快得多(即使它在L1緩存中)。

在任何情況下,調用者和被調用者都會同意參數傳遞方法是非常重要的。
當一個函數使用非標準方法時,它用一個編譯器屬性標記。
該屬性告訴編譯器兩件事情 - 編譯函數本身時,它知道參數是在哪裏預期的,編譯調用時它知道把它們放在哪裏。