.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
-.TH SYSCALL 2 2012\-08\-14 Linux "Linux Programmer's Manual"
+.\"
+.\" 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>
+.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-07-24, Akihiro MOTOKI <amotoki@gmail.com>
+.\"
+.TH SYSCALL 2 2014\-04\-06 Linux "Linux Programmer's Manual"
.SH 名前
syscall \- 間接システムコール
.SH 書式
.nf
\fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
\fB#include <unistd.h>\fP
-\fB#include <sys/syscall.h> \fP/* For SYS_xxx definitions */
+\fB#include <sys/syscall.h> \fP/* SYS_xxx の定義用 */
\fBint syscall(int \fP\fInumber\fP\fB, ...);\fP
.fi
.SH 説明
-\fBsyscall\fP() is a small library function that invokes the system call whose
-assembly language interface has the specified \fInumber\fP with the specified
-arguments. Employing \fBsyscall\fP() is useful, for example, when invoking a
-system call that has no wrapper function in the C library.
+\fBsyscall\fP() は、システムコールを起動する小さなライブラリ関数で、 \fInumber\fP
+で指定されたアセンブリ言語インターフェースのシステムコールを、指定された引き数をつけて実行する。 \fBsyscall\fP() が役に立つのは、例えば C
+ライブラリにラッパー関数が存在しないシステムコールを呼び出したい場合である。
-\fBsyscall\fP() saves CPU registers before making the system call, restores
-the registers upon return from the system call, and stores any error code
-returned by the system call in \fBerrno\fP(3) if an error occurs.
+\fBsyscall\fP() は、システムコールを行う前に CPU
+レジスタを保存し、システムコールから返った際にレジスタを復元し、エラーが発生した場合はシステムコールが返したエラーコードを \fBerrno\fP(3)
+に格納する。
-Symbolic constants for system call numbers can be found in the header file
-\fI<sys/syscall.h>\fP.
+システムコールのシンボル定数は、ヘッダファイル \fI<sys/syscall.h>\fP に書かれている。
.SH 返り値
返り値は呼び出されたシステムコールによって定義される。 一般に、返り値 0 は成功を表す。 \-1 はエラーを表し、エラーコードは \fIerrno\fP
に入れられる。
.SH 注意
\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
+つの表にまとめる。
+
+最初の表は、 カーネルモードに遷移するのに使用される命令、 システムコール番号を示すのに使用されるレジスタ、
+システムコールの結果を返すのに使用されるレジスタの一覧である (なお、 ここに載っているカーネルモードに遷移するのに使用される命令は、
+カーネルモードに遷移する最速や最善の方法でない場合もあるので、 \fBvdso\fP(7) を参照する必要があるかもしれない)。
+.if t \{\
+.ft CW
+\}
+.TS
+l l1 l l1 l.
+arch/ABI instruction syscall # retval Notes
+_
+arm/OABI swi NR \- a1 NR はシステムコール番号
+arm/EABI swi 0x0 r7 r0
+blackfin excpt 0x0 P0 R0
+i386 int $0x80 eax eax
+ia64 break 0x100000 r15 r10/r8 T{
+真偽値のエラー/
+.br
+エラー値
+T}
+parisc ble 0x100(%sr2, %r0) r20 r28
+s390 svc 0 r1 r2 下記参照
+s390 svc 0 r1 r2 下記参照
+sparc/32 t 0x10 g1 o0
+sparc/64 t 0x6d g1 o0
+x86_64 syscall rax rax
+.TE
+.PP
+s390 と s390x では、 NR (システムコール番号) が 256 未満の場合 "svc NR" で NR が直接渡される場合がある。
+.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 r0 r1 r2 r3 r4 r5 r6
+blackfin R0 R1 R2 R3 R4 R5 \-
+i386 ebx ecx edx esi edi ebp \-
+ia64 out0 out1 out2 out3 out4 out5 \-
+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
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
+#include <signal.h>
int
main(int argc, char *argv[])
pid_t tid;
tid = syscall(SYS_gettid);
- tid = syscall(SYS_tgkill, getpid(), tid);
+ tid = syscall(SYS_tgkill, getpid(), tid, SIGHUP);
}
.fi
.SH 関連項目
-\fB_syscall\fP(2), \fBintro\fP(2), \fBsyscalls\fP(2)
+\fB_syscall\fP(2), \fBintro\fP(2), \fBsyscalls\fP(2), \fBvdso\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.50 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.64 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。