2012-03-30 16 views
3

私は学習目的でx86 Linux用に独自のlibcライブラリを作成したいと思います。そのためには、アセンブリ言語レベルでLinuxシステムコールを呼び出す必要があります。私はLinux上でアセンブリでシステムコールをする方法を知っています。しかし、私はLinuxシステムコールに関する完全な情報を持っている必要があります。Linuxシステムコールの詳細な文書をお探しください

私はシステムコールごとに入力と出力のようなLinuxシステムコールの詳細なドキュメントを探しています。誰でもLinuxのシステムコールのURL/PDFを提供してください。

たとえば、 'sys_socketcall'呼び出しの場合、AX = 102のレジスタ、BXにはcreate/bindなどのメソッドの呼び出し番号が含まれ、CXには 'unsigned long'へのポインタが含まれている必要があります。ここでは、第3パラメータ(CX)に関する詳細情報が必要です。

+1

'libc' on 8086?あなたは私を気絶させました!とにかくここから始めることができますhttp://stackoverflow.com/questions/9506353/how-to-invoke-a-system-call-via-sysenter-in-inline-assembly-x86-amd64-linux –

+0

https:///stackoverflow.com/questions/3614995/linux-system-call-table-or-cheetsheet-in-assembly-language –

答えて

1

Linuxカーネル上で最良の情報源は、驚くべきことには、その源である:https://github.com/torvalds/linux/blob/master/include/linux/syscalls.hが必要なコールの定義が含まれている必要があります。

呼び出し元:http://lxr.free-electrons.com/source/net/socket.c#L2366ここでは、パラメータの処理方法を確認できます。

ネットでLinuxのソースをすばやくgrepするには、LXR:http://lxr.free-electrons.com/ident?i=sys_socketcallを使用します。

+0

「sys_socket(int、int、int);」の各入力についてはわかりませんが、 API。 Linuxのコード解析を通じて、私はここでそれぞれの入力が意味するものを理解することができました。しかし、時間がかかり、何かを誤解するかもしれません。だから私はLinuxシステムコールの詳細な情報を探しています。 –

+0

要するに、 'call'引数の値に応じて、呼び出しの引数の数が異なります。学習のためにlibcを本当に再実装したいのであれば、ARMのようないくつかの現代的なプラットフォームを選ぶ方がいいでしょう。8086で動くカーネルバージョンが問題そのものです。 – vissi2

+0

2349行を見ると、 'call'値(BXレジスタに格納されている)に応じて、引数カウントの配列が含まれています。 – vissi2

1

socketcallシステムコールは特殊なケースなので、一般的な形式を知るためにはこの例に頼らないでください。さらに、それはx86-32上にのみ存在し、他のプラットフォームはソケット操作の各関数/プロシージャに対して別々のシステムコールを使用します(socketcallではなく、socket,bindなど)。それはeax__NR_socketcallebxサブ機能(EX SYS_SOCKETSYS_BINDなど)数とecxにおける他の引数のアドレスを期待:socketcallである特別な場合について

。たとえば、ソケット操作(ソケットの作成)のための3ワード、my_array[0]のタイプ、my_array[1]のタイプ、およびプロトコル(通常は0)の配列を格納する必要があります。my_array[2]のアドレスを渡します。 my_arrayをecxに設定してください(何の明示的な方法でもmy_arrayの要素の数を渡さない、それはあなたが呼び出すソケットのサブ関数に暗示されています)。

あなたはこれらの文書を好きなことがあります。

さて、socketcall例外ではない、他のシステムコールのために、あなただけcorrespodingのPOSIX機能の参照を取得する必要があります(referenceを参照)、または機能の対応する記述のman(2)から( man(2)はマニュアルページのセクションで、システムコール専用です)。例としては、man-pages section 2があります。次に、引数の順序に注意する必要があります。あなたは(6つの引数まで)man(2)またはPOSIXのいずれかにより記載されているように、ebx、順番に、に、同じ順序で他のすべての引数は、その後、eaxにシステムコール番号を渡すecxedxesiediebpます。ステータス/結果はeaxに返されます。

上記はIntelアーキテクチャのLinuxのみに適用されます(他のプロセッサには他のレジスタがあると思います)。x86-32とx86-64ではシステムコール番号が異なります。

関連する問題