2013-12-11 7 views
5

私は自分自身にLinuxアセンブリ言語を教えています。私はBSDとLinuxの間に興味深い違いがあります。 Unixでは、80h割り込みを呼び出す前にsyscallのパラメータをスタックにプッシュします。対照的に、Linuxでは、パラメータをレジスタに渡します。LinuxがUnixのシステムコール規約に従わない理由は何ですか?

Linux開発者がスタックの代わりにレジスタを使う理由は誰にも分かりますか?

注:この相違点の詳細は​​、FreeBSD Developer's Handbook:System Callsの根拠を説明することなく説明しています。

+0

明確なアイデアはありませんが、実行速度と場所のアクセシビリティに関連する可能性がありますか?誰かが明確になるのを待つ。 –

+3

なぜBSDが "Unix"と呼ぶのですか? – unwind

+0

@unwind - 私の質問に含まれているハイパーリンクは、BSDがUNIXシステムでのsyscallsの規定に従い、Linuxはそうではないことを示唆しています。それ以外は? – clay

答えて

1

標準の関数呼び出し順序が異なるため、syscallの規則が異なります。あなたがx86-32呼び出し規約とAMD64呼び出し規約の違いについて話していると仮定しています。 AMD64 ABI hereをご覧ください。

しかし、ポイントにすぐにアクセスしたい場合は、thisの投稿を確認してください。基本的にはスピードです。呼び出し規約を変更し、スタックの代わりにレジスタを使用することで、プロローグと呼び出しのエピローグで命令を省略できます。

1

32ビットコードのレジスタも使用できます。 32ビットコードには、cdecl、stdcall、pascal、fastcallの呼び出し規則がいくつかあります。 WindowsとLinuxでは、32ビットコードと同じ呼び出し規約が使用されています。 fastcall(GCCの__attribute((fastcall))では、最初の2つの整数パラメータ(コンパイラには3つ)がレジスタになります。他の呼び出し規約はスタックを使用します。

64ビットコードの場合、WindowsとLinuxでは異なる呼び出し規約を使用します。 Linuxは、呼び出しには最大14個のレジスタを使用し、Windowsは6個しか使用できません。レジスタを使用するとコードを高速化できます。これは、多くの関数呼び出しを含む64ビットコードの一部が、同じ32ビットコードよりもO(10%)高速に実行される理由の一部になる可能性があります。

関連する問題