OSDN Git Service

(split) LDP: Update releases based on LDP 3.52 release
[linuxjm/LDP_man-pages.git] / release / man2 / syscall.2
index 0788557..050f921 100644 (file)
@@ -1,6 +1,7 @@
 .\" Copyright (c) 1980, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
+.\" %%%LICENSE_START(BSD_4_CLAUSE_UCB)
 .\" Redistribution and use in source and binary forms, with or without
 .\" modification, are permitted provided that the following conditions
 .\" are met:
@@ -28,6 +29,7 @@
 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
+.\" %%%LICENSE_END
 .\"
 .\"     @(#)syscall.2  8.1 (Berkeley) 6/16/93
 .\"
 .\" 2002-03-20  Christoph Hellwig <hch@infradead.org>
 .\"    - adopted for Linux
 .\"
-.\" Japanese Version Copyright (c) 2002 Yuichi SATO
-.\"         all rights reserved.
-.\" Translated Tue Aug  6 03:43:25 JST 2002
-.\"         by Yuichi SATO <ysato@h4.dion.ne.jp>
+.\"*******************************************************************
 .\"
-.TH SYSCALL 2 2007-07-26 "Linux" "Linux Programmer's Manual"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH SYSCALL 2 2013\-06\-21 Linux "Linux Programmer's Manual"
 .SH 名前
 syscall \- 間接システムコール
 .SH 書式
 .nf
-.BR "#define _GNU_SOURCE" "         /* feature_test_macros(7) 参照 */"
-.B #include <unistd.h>
-.BR "#include <sys/syscall.h>   "  "/* For SYS_xxx definitions */"
+\fB#define _GNU_SOURCE\fP         /* feature_test_macros(7) 参照 */
+\fB#include <unistd.h>\fP
+\fB#include <sys/syscall.h>   \fP/* SYS_xxx の定義用 */
 
-.BI "int syscall(int " number ", ...);"
+\fBint syscall(int \fP\fInumber\fP\fB, ...);\fP
 .fi
 .SH 説明
-.BR syscall ()
-は
-.I number
-で指定されたアセンブリ言語インターフェースのシステムコールを、
-指定された引き数をつけて実行する。
-システムコールのシンボル定数はヘッダファイル
-.I <sys/syscall.h>
-に書かれている。
+\fBsyscall\fP() は、システムコールを起動する小さなライブラリ関数で、 \fInumber\fP
+で指定されたアセンブリ言語インターフェースのシステムコールを、指定された引き数をつけて実行する。 \fBsyscall\fP() が役に立つのは、例えば C
+ライブラリにラッパー関数が存在しないシステムコールを呼び出したい場合である。
+
+\fBsyscall\fP() は、システムコールを行う前に CPU
+レジスタを保存し、システムコールから返った際にレジスタを復元し、エラーが発生した場合はシステムコールが返したエラーコードを \fBerrno\fP(3)
+に格納する。
+
+システムコールのシンボル定数は、ヘッダファイル \fI<sys/syscall.h>\fP に書かれている。
 .SH 返り値
-返り値は呼び出されたシステムコールによって定義される。
-一般に、返り値 0 は成功を表す。
-\-1 はエラーを表し、エラーコードは
-.I errno
+返り値は呼び出されたシステムコールによって定義される。 一般に、返り値 0 は成功を表す。 \-1 はエラーを表し、エラーコードは \fIerrno\fP
 に入れられる。
 .SH 注意
-.BR syscall ()
-は 4BSD で最初に登場した。
+\fBsyscall\fP()  は 4BSD で最初に登場した。
+.SS アーキテクチャ固有の要件
+各アーキテクチャの ABI には、 システムコールの引き数のカーネルへの渡し方に関する独自の要件がある。
+(ほとんどのシステムコールのように) glibc ラッパー関数があるシステムコールでは、 glibc
+が詳細を処理し、アーキテクチャに応じた方法で引き数が適切なレジスタにコピーされる。 しかし、 システムコールを呼び出すのに \fBsyscall\fP()
+を使う場合には、 呼び出し側でアーキテクチャ依存の詳細を処理しなければならない場合がある。 これはいくつかの 32
+ビットアーキテクチャでは非常によくあることだ。
+
+例えば、ARM アーキテクチャの Embedded ABI (EABI) では、 (\fIlong long\fP などの) 64
+ビット値は偶数番地のレジスタのペアに境界があっていなければならない。したがって、 glibc が提供するラッパー関数ではなく \fBsyscall\fP()
+を使う場合には、 \fBreadahead\fP() システムコールは ARM アーキテクチャの EABI では以下のようにして起動されることになる。
+
+.in +4n
+.nf
+syscall(SYS_readahead, fd, 0,
+        (unsigned int) (offset >> 32),
+        (unsigned int) (offset & 0xFFFFFFFF),
+        count);
+.fi
+.in
+.PP
+オフセット引き数は 64 ビットで、最初の引き数 (\fIfd\fP) は \fIr0\fP で渡されるので、呼び出し側では手動で 64
+ビット値を分割して境界を合わせて、 64 ビット値が \fIr2\fP/\fIr3\fP レジスタペアで渡されるようにしなければならない。このため、 \fIr1\fP
+(2 番目の引数 0) としてダミー値を挿入している。
+
+.\" Mike Frysinger: this issue ends up forcing MIPS
+.\" O32 to take 7 arguments to syscall()
+同様のことが、 MIPS の O32 ABI、 PowerPC の 32 ビット ABI や Xtensa でも起こりうる。
+
+次のシステムコールに影響がある: \fBfadvise64_64\fP(2), \fBftruncate64\fP(2), \fBposix_fadvise\fP(2),
+\fBpread64\fP(2), \fBpwrite64\fP(2), \fBreadahead\fP(2), \fBsync_file_range\fP(2),
+\fBtruncate64\fP(2)
+.SS アーキテクチャ毎の呼び出し規約
+各アーキテクチャには、それぞれ独自のシステムコール起動方法とカーネルへの引き数の渡し方がある。 各種のアーキテクチャの詳細を以下の 2
+つの表にまとめる。
+
+最初の表は、 カーネルモードに遷移するのに使用される命令、 システムコール番号を示すのに使用されるレジスタ、
+システムコールの結果を返すのに使用されるレジスタの一覧である (なお、 ここに載っているカーネルモードに遷移するのに使用される命令は、
+カーネルモードに遷移する最速や最善の方法でない場合もあるので、 VDSO を参照する必要があるかもしれない)。
+.if  t \{\
+.ft CW
+\}
+.TS
+l l1 l l1 l.
+arch/ABI       instruction     syscall #       retval  Notes
+_
+arm/OABI       swi NR  \-      a1      NR is syscall #
+arm/EABI       swi 0x0 r7      r1
+blackfin       excpt 0x0       P0      R0
+i386   int $0x80       eax     eax
+ia64   break 0x100000  r15     r10/r8
+parisc ble 0x100(%sr2, %r0)    r20     r28
+s390   svc 0   r1      r2      NR may be passed directly with
+s390x  svc 0   r1      r2      "svc NR" if NR is less than 256
+sparc/32       t 0x10  g1      o0
+sparc/64       t 0x6d  g1      o0
+x86_64 syscall rax     rax
+.TE
+.if  t \{\
+.in
+.ft P
+\}
+.PP
+2 つ目の表は、システムコールの引き数を渡すのに使用されるレジスタの一覧である。
+.if  t \{\
+.ft CW
+\}
+.TS
+l l l l l l l l.
+arch/ABI       arg1    arg2    arg3    arg4    arg5    arg6    arg7
+_
+arm/OABI       a1      a2      a3      a4      v1      v2      v3
+arm/EABI       r1      r2      r3      r4      r5      r6      r7
+blackfin       R0      R1      R2      R3      R4      R5      \-
+i386   ebx     ecx     edx     esi     edi     ebp     \-
+ia64   r11     r9      r10     r14     r15     r13     \-
+parisc r26     r25     r24     r23     r22     r21     \-
+s390   r2      r3      r4      r5      r6      r7      \-
+s390x  r2      r3      r4      r5      r6      r7      \-
+sparc/32       o0      o1      o2      o3      o4      o5      \-
+sparc/64       o0      o1      o2      o3      o4      o5      \-
+x86_64 rdi     rsi     rdx     r10     r8      r9      \-
+.TE
+.if  t \{\
+.in
+.ft P
+\}
+.PP
+これらの表にはすべての呼び出し規約が記載されているわけではない点に注意すること \(em
+アーキテクチャによっては、ここに記載されていない他のレジスタが見境なく上書きされる場合もある。
 .SH 例
 .nf
 #define _GNU_SOURCE
@@ -82,9 +170,12 @@ main(int argc, char *argv[])
     pid_t tid;
 
     tid = syscall(SYS_gettid);
+    tid = syscall(SYS_tgkill, getpid(), tid);
 }
 .fi
 .SH 関連項目
-.BR _syscall (2),
-.BR intro (2),
-.BR syscalls (2)
+\fB_syscall\fP(2), \fBintro\fP(2), \fBsyscalls\fP(2)
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.52 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。