2012-05-05 24 views
29

私はそれがLinuxでシステムコールを実装する関数に使用されていると読んでいます。たとえば :'asmlinkage'修飾語は何の意味ですか?

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

、それがスタック上のすべての関数の引数を渡すようにコンパイラに指示しますということ。しかし、それはすでにケースですか?関数の引数は、一般的にスタック上にプッシュするだけで渡されます。あるいは、ここで関数の引数をレジスタに渡すことについて言及していますか?

+3

Linuxカーネル関数の最初のパラメータは、デフォルトでx86のレジスタに渡されることに注意してください。 x86-32では、最初の3つのパラメータは '%eax'、'%edx'、 '%ecx'の順に渡され、残りはスタックに入れられます。可変引数リストを持つ関数は例外です。引数はすべてx86-32のスタックにあります。 x86-64では、最初の6つのパラメータは '%rdi'、'%rsi'、 '%rdx'、'%rcx'、 '%r8'、'%r9'(varargsを持つ関数の場合でも)に渡されます。その順序で、残りはスタックに置かれます。システムコールは異なる慣習に従います。 – Eugene

+0

(続き)@dirkgentlyで指摘されているように、 'asmlinkage'はパラメータ渡しに関するデフォルトの規約を変更する方法です。 [Agner Fogのマニュアル](http://www.agner.org/optimize/calling_conventions.pdf)のさまざまな呼び出し規約の詳細な説明も参照してください。 – Eugene

+0

Quoraには良い説明があります:[https://www.quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls](https://www .quora.com/Linux-Kernel/what-does-asmlink-in-the-system-of-the-system-callsを意味します)。 –

答えて

26

FAQがあります:

asmlinkageタグは、我々はおよそ この単純な機能を守るべき一つの他の事です。これは、コンパイラに 引数を(一般的な最適化の) 引数が見つからないと予想するべきではなく、CPUの スタック上だけであることをコンパイラに伝えるgccの魔法の#defineです。 system_callは最初の引数であるシステムコール番号 を消費し、実際のシステムコールに引き継がれる引数は最大でも4つまでです。 system_call は、他の引数(レジスタにそれに渡された )をスタックに残すだけで、この偉業を達成します。すべてのシステムコールには、asmlinkageタグを付けた というマークが付けられているため、スタックのすべての引数を調べます。 もちろん、sys_ni_syscallの場合、 の場合はsys_ni_syscallに引数はありませんが、それ以外のほとんどのシステムコールでは という問題があります。そして、他の多くの機能の前にasmlinkage が表示されるので、私はあなたにそれが何であるかを知っておくべきだと思っていたと思った。

アセンブリファイルから関数を呼び出すこともできます。

+6

なぜなら、userspaceからのシステムコール要求を処理するときに、カーネルが(ユーザ空間に戻る前に環境を復元するために)スタックにすべてのレジスタを保存する必要があるからです。つまり、余分な努力は必要ありません。ソース:http://stackoverflow.com/questions/10060168/is-asmlinkage-required-for-a-c-function-to-be-called-from-assembly – kumar