49

Linuxでシステムコールを実装する関数に使用されていることを読みました。例えば:

asmlinkage long sys_getjiffies( void )
{
  return (long)get_jiffies_64();
}

そして、スタック上のすべての関数の引数を渡すようにコンパイラーに指示します。しかし、それはすでにそうではありませんか?関数の引数は通常、スタックにのみプッシュすることで渡されます。それとも、ここでレジスタを介して関数の引数を渡すことを指しているのでしょうか?

4

1 に答える 1

43

FAQがあります:

asmlinkageタグは、この単純な関数について注意する必要があるもう1つのことです。これは、関数がレジスター(一般的な最適化)で引数を検出することを期待せず、CPUのスタックでのみ検出することをコンパイラーに指示するgccマジックの#defineです。system_callが最初の引数であるシステムコール番号を消費し、実際のシステムコールに渡される最大4つの引数を許可するという以前の主張を思い出してください。system_callは、他の引数(レジスターで渡されたもの)をスタックに残すだけでこの機能を実現します。すべてのシステムコールはasmlinkageタグでマークされているため、すべてスタックで引数を探します。もちろん、sys_ni_syscallの場合、これは何の違いもありません。sys_ni_syscall引数を取りませんが、他のほとんどのシステムコールでは問題になります。そして、他の多くの機能の前で見ることができるので、asmlinkage それが何であるかを知っておくべきだと思いました。

また、アセンブリファイルから関数を呼び出せるようにするためにも使用されます。

于 2012-05-05T07:04:41.897 に答える