1. ホーム
  2. c

[解決済み] asmlinkage」モディファイアは何のためにあるのですか?

2022-02-03 13:44:04

質問

Linuxのシステムコールを実装する関数に使用されると書いてありました。 例えば

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

と、関数の引数をすべてスタックで渡すようにコンパイラに指示します。しかし、すでにそうなっているのではないでしょうか?関数の引数は、一般にスタックにのみプッシュして渡される。それとも、ここではレジスタを介して関数引数を渡すことを指しているのだろうか?

解決方法は?

には よくある質問 :

asmlinkageタグについて、もう1つ確認しておきたいことがあります。 この単純な関数が これは#defineで、gccのマジックで コンパイラは、この関数がどのような の引数をレジスタに格納し(一般的な最適化)、CPUの スタックに格納されます。system_call はそのスタックを消費する、という先ほどの主張を思い出してください。 最初の引数であるシステムコール番号と、さらに最大4つの の引数は、実際のシステムコールに渡されます。 この偉業は、単に他の引数(これらは レジスタで渡される)スタック上にある。すべてのシステムコールは asmlinkageタグを使用しているため、すべての引数がスタックに格納されています。 もちろん sys_ni_syscall の場合、これは何の違いもない。 なぜなら sys_ni_syscall は引数を取らないが、これは問題である。 他のほとんどのシステムコールでは また asmlinkage が、他の多くの関数の前に表示されるので、それが何であるかを知っておくべきだと思いました。 のことでした。

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