2012-04-29 9 views
0

先週、インストラクターはLinuxでの割り込み、特にdo_IRQ関数の処理について語った。私はdo_IRQ関数がなぜスタックからではなくレジスタからそのパラメータを読み込むのかと疑問に思った。しかし、インストラクターはまた、この理由を知らなかった。今、私はまだdo_IRQのようなカーネル関数のいくつかがスタックからではなくレジスタから必要なパラメータを読み込むのはなぜかと思っています。私はそれを見つけたが、私は関数がレジスタまたはスタックからパラメータを読み取ったが、その理由は見つからなかった。スタックからではなくレジスタからパラメータを読み取る

+0

"呼び出し規約"については、 – blueshift

+0

を呼び出してください。呼び出し規約とIRQ関数に対するレジスタスタックフレームの利用可能性の間に混乱がありますか? – stsquad

答えて

0

カーネル2.6以降、すべてのカーネル関数は、スタックではなくレジスタを使用して最初の3つのパラメータ(x86_64では6)を渡します。
古代の2.4カーネルでは、わずかなパフォーマンスクリティカルな機能(例:do_IRQ)がこのように機能します。あなたのインストラクターは2.4カーネルについて教えてくれますか?

レジスタにパラメータを渡すと、パフォーマンスが向上します。
メモリに比べて(L1キャッシュ内にあっても)レジスタを読み書きする方がはるかに高速です。

すべての場合、呼び出し元と呼び出し先がパラメータ渡しメソッドについて合意することが非常に重要です。
関数が非標準メソッドを使用する場合、コンパイラ属性でマークされます。
この属性はコンパイラに2つのことを伝えます。つまり、関数自体をコンパイルするときには、パラメータが期待される場所が分かり、呼び出しをコンパイルするときにはどこに配置するのかが分かります。

関連する問題