0

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

4

1 に答える 1

0

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

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

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

于 2012-04-30T10:31:58.980 に答える