2016-08-03 14 views
2

私はカーネルのシステムコールの戻り値について調べるときに、それらを記述するテーブルと、それらを動作させるために異なるレジスタに入れる必要があるものを見つけます。しかし、私はとは何のドキュメントも見つかりません。はシステムコールから得た戻り値です。私はちょうど私が受け取ったものがEAXの登録簿にあることを別の場所で見つけることです。Assemblyのシステムコールの戻り値は何ですか?


TutorialsPoint

結果は通常、EAXレジスタに返されます。

アセンブリ言語のステップ・バイ・ステップ:ジェフDuntemannによってLinuxのブックを使用したプログラミングの彼のプログラムの中で何度も述べている:EAXでSYS_READの戻り値で

  • ルック

  • コピーsys_read安全な保管のための戻り値


私が持っているウェブサイトのいずれかがこの戻り値について説明していません。インターネットはありますか?あるいは、誰かがこの値について私に説明することができますか?

+0

「sys_read」という語を試してみてください。ここに私が見つけたものがあります。 http://asm.sourceforge.net/syscall.html –

+0

@MarkLakata私は試しましたが、助けませんでした。私が述べたように、それは、私がsyscallsが動作するように、私は別のレジスタに何を入れる必要があるのか​​だけを言います。 (例:[ここ](http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html)と[ここ](http://blog.rchapman.org/post/36801038863/linux -system-call-table-for-x86-64)) –

+1

"sys_read"とグーグルでは、4番目のリンクはhttps://lwn.net/Articles/604287/です。 –

答えて

5

また、C知識を前提としたthis excellent LWN article about system callsも参照してください。また

The Definitive Guide to Linux System Calls (on x86)、および関連:What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?


Cは、Unixシステムプログラミングの言語なので、すべてのドキュメントはC.の面である。そしてCインターフェース間のわずかな違いのためのドキュメントがありますasmは任意のプラットフォーム上で、通常はマニュアルページの「Notes」セクションにあります。

sys_readは、(libcラッパー関数ではなく)ローシステムコールを意味します。 readシステムコールのカーネル実装はsys_read()と呼ばれるカーネル関数です。 call命令で呼び出すことはできません。なぜなら、ライブラリではなくカーネル内にあるからです。しかし、人々はまだ "sys_readと呼んで"、libc関数呼び出しと区別しています。しかし、この答えのように、生のシステムコール(特にlibcラッパーが特別なことをしないとき)を意味する場合でも、readと言っても大丈夫です。

また、syscall.hは、SYS_readのような定数を実際のシステムコール番号で定義しています。 (あなたがint 0x80またはsyscall命令の前にEAXに入れた値)。 (x86版EAX/RAX中)


のLinuxシステムコールの戻り値は負の成功のための値、またはa negative error codeいずれかです。例えば-EFAULT無効なポインタを渡した場合。

この動作は、syscalls(2)のマニュアルページに記載されています。

実際には-1〜-4095はエラーを意味し、それ以外の場合はすべてを意味します。 glibcのgeneric syscall(2) wrapperはこのシーケンスを使用します:cmp rax, -4095/jae SYSCALL_ERROR_LABEL、これは明らかにすべてのLinuxシステムコールでguaranteed to be future-proofです。興味深いケースにはmmapがあり、有効なアドレスはcan have the sign bit set, but must be page alignedgetpriorityで、カーネルABIは-20..19の戻り値の範囲を1.40にマッピングし、libcはそれをデコードします。詳細はa related answer about decoding syscall error return valuesです。

アップデートすると、確かにすべてのシステムコールが保証されます。-4095 .. -1は、Linuxが実行されているすべてのアーキテクチャのエラーの範囲です。詳細は、AOSP non-obvious syscall() implementationを参照してください。 (将来、異なるアーキテクチャーはMAX_ERRNOに異なる値を使用できますが、x86-64のような既存のアーチの値は、カーネルABIを安定に保つためのLinuxのドント・ブレーク・ユーザー空間ポリシーの一部と同じであることが保証されます。 )


特定のプラットフォーム用の定数の実際の数値を見つけるために、あなたは彼らが#define DだCヘッダファイルを見つける必要があります。詳細は、my answer on a question about thatを参照してください。各SYSコールの戻り値の


意味はread(2)のように、セクション2のmanページに記載されています。 (sys_readは、glibc read()関数が非常に細いラッパーである生システムコールです。)ほとんどのマニュアルページは戻り値のセクション全体を持っています。例えば成功し

戻り値

は、返された読み取られたバイトの数は、(ゼロファイルの 終わりを示す)、およびファイル位置はこの数だけ進められます。この番号が要求されたバイト数 より小さい場合は、 はエラーではありません。これはたとえば、
実際に現在利用可能なバイト数が少なくなっている可能性があります(
ファイル、またはパイプや端末から読み取っている可能性があります)。
()はシグナルによって中断されました。 NOTESも参照してください。

エラーの場合、-1が返され、errnoが適切に設定されます。この の場合、ファイル位置(ある場合)
が変更されるかどうかは不明です。

最後の段落は、生のシステムコールの戻り値が負の場合glibcのラッパーが-EAXに価値とsets errnoをデコードする方法について説明し、そのerrno=EFAULTと生のシステムコールが-EFAULTを返した場合-1を返すことに注意してください。

そして、read()が返すことができるすべてのエラーコードと、具体的にはread()の意味を記載したセクションがあります。 (POSIXはこの動作のほとんどを標準化しています。)


私はglibcのは、戻り値は符号付きの型ではありませんmmap(2)、の戻り値をデコードし、正確にどこか分かりません。おそらく、一般的なsyscallラッパー(符号なしの値> -4096ULをチェックする)と同じメソッドを使用しますが、各システムコールの特定のラッパーは、実際にレジスタ間の引数をシャッフルしてその関数を呼び出すオーバーヘッドはありません。

私はそれを見ていないよin the glibc source tree;おそらくそれはマクロのいくつかの層の下に埋め込まれているでしょう。例えばin the x86-64 macro

+0

1. * sys_read *は 'read()'と同じですか? 2. '-errno'、' -EFAULT'、および '-retval'とは何ですか?どのようにアセンブリに関連していますか? –

+1

@PichiWuana:1.はい、もちろんです。 2. CはUnixシステムプログラミング言語です。すべてがC言語で文書化されています。 Cは基本的には移植可能なアセンブリ言語です。 ['errno'はグローバルです](http://man7.org/linux/man-pages/man3/errno.3.html)。ライブラリ関数がエラーに遭遇した後に設定されます。 '-'はC単項否定演算子です。 'EFAULT'はCプリプロセッサマクロによって定義された整数定数です。 'retval'は変数名です。私は、システムコールの後にEAXが保持するものを記述するために作ったものです。 –

+0

あなたが良いアセンブリプログラミングを知っていれば、Cを簡単に理解できるでしょうか?およびその逆? –

関連する問題