.\"
.\" 2002-03-20 Christoph Hellwig <hch@infradead.org>
.\" - adopted for Linux
+.\" 2015-01-17, Kees Cook <keescook@chromium.org>
+.\" Added mips and arm64.
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
-.TH SYSCALL 2 2013\-04\-07 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 2015\-01\-22 Linux "Linux Programmer's Manual"
.SH 名前
syscall \- 間接システムコール
.SH 書式
\fB#include <unistd.h>\fP
\fB#include <sys/syscall.h> \fP/* SYS_xxx の定義用 */
-\fBint syscall(int \fP\fInumber\fP\fB, ...);\fP
+\fBlong syscall(long \fP\fInumber\fP\fB, ...);\fP
.fi
.SH 説明
\fBsyscall\fP() は、システムコールを起動する小さなライブラリ関数で、 \fInumber\fP
ライブラリにラッパー関数が存在しないシステムコールを呼び出したい場合である。
\fBsyscall\fP() は、システムコールを行う前に CPU
-ã\83¬ã\82¸ã\82¹ã\82¿ã\82\92ä¿\9då\98ã\81\97ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81\8bã\82\89è¿\94ã\81£ã\81\9fé\9a\9bã\81«ã\83¬ã\82¸ã\82¹ã\82¿を復元し、エラーが発生した場合はシステムコールが返したエラーコードを \fBerrno\fP(3)
+ã\83¬ã\82¸ã\82¹ã\82¿ã\83¼ã\82\92ä¿\9då\98ã\81\97ã\80\81ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81\8bã\82\89è¿\94ã\81£ã\81\9fé\9a\9bã\81«ã\83¬ã\82¸ã\82¹ã\82¿ã\83¼を復元し、エラーが発生した場合はシステムコールが返したエラーコードを \fBerrno\fP(3)
に格納する。
-システムコールのシンボル定数は、ヘッダファイル \fI<sys/syscall.h>\fP に書かれている。
+ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81®ã\82·ã\83³ã\83\9cã\83«å®\9aæ\95°ã\81¯ã\80\81ã\83\98ã\83\83ã\83\80ã\83¼ã\83\95ã\82¡ã\82¤ã\83« \fI<sys/syscall.h>\fP ã\81«æ\9b¸ã\81\8bã\82\8cã\81¦ã\81\84ã\82\8bã\80\82
.SH 返り値
返り値は呼び出されたシステムコールによって定義される。 一般に、返り値 0 は成功を表す。 \-1 はエラーを表し、エラーコードは \fIerrno\fP
に入れられる。
.SH 注意
\fBsyscall\fP() は 4BSD で最初に登場した。
-.SS アーキテクチャ固有の要件
-Each architecture ABI has its own requirements on how system call arguments
-are passed to the kernel. For system calls that have a glibc wrapper (e.g.,
-most system calls), glibc handles the details of copying arguments to the
-right registers in a manner suitable for the architecture. However, when
-using \fBsyscall\fP() to make a system call, the caller might need to handle
-architecture\-dependent details; this requirement is most commonly
-encountered on certain 32\-bit architectures.
+.SS アーキテクチャー固有の要件
+各アーキテクチャーの ABI には、 システムコールの引き数のカーネルへの渡し方に関する独自の要件がある。
+(ほとんどのシステムコールのように) glibc ラッパー関数があるシステムコールでは、 glibc
+が詳細を処理し、アーキテクチャーに応じた方法で引き数が適切なレジスターにコピーされる。 しかし、 システムコールを呼び出すのに \fBsyscall\fP()
+を使う場合には、 呼び出し側でアーキテクチャー依存の詳細を処理しなければならない場合がある。 これはいくつかの 32
+ビットアーキテクチャーでは非常によくあることだ。
-例えば、ARM アーキテクチャの Embedded ABI (EABI) では、 (\fIlong long\fP などの) 64
-ビット値は偶数番地のレジスタのペアに境界があっていなければならない。したがって、 glibc が提供するラッパー関数ではなく \fBsyscall\fP()
-を使う場合には、 \fBreadahead\fP() システムコールは ARM アーキテクチャの EABI では以下のようにして起動されることになる。
+ä¾\8bã\81\88ã\81°ã\80\81ARM ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81® Embedded ABI (EABI) ã\81§ã\81¯ã\80\81 (\fIlong long\fP ã\81ªã\81©ã\81®) 64
+ã\83\93ã\83\83ã\83\88å\80¤ã\81¯å\81¶æ\95°ç\95ªå\9c°ã\81®ã\83¬ã\82¸ã\82¹ã\82¿ã\83¼ã\81®ã\83\9aã\82¢ã\81«å¢\83ç\95\8cã\81\8cã\81\82ã\81£ã\81¦ã\81\84ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\80\82ã\81\97ã\81\9fã\81\8cã\81£ã\81¦ã\80\81 glibc ã\81\8cæ\8f\90ä¾\9bã\81\99ã\82\8bã\83©ã\83\83ã\83\91ã\83¼é\96¢æ\95°ã\81§ã\81¯ã\81ªã\81\8f \fBsyscall\fP()
+ã\82\92使ã\81\86å ´å\90\88ã\81«ã\81¯ã\80\81 \fBreadahead\fP() ã\82·ã\82¹ã\83\86ã\83 ã\82³ã\83¼ã\83«ã\81¯ ARM ã\82¢ã\83¼ã\82ã\83\86ã\82¯ã\83\81ã\83£ã\83¼ã\81® EABI ã\81§ã\81¯ä»¥ä¸\8bã\81®ã\82\88ã\81\86ã\81«ã\81\97ã\81¦èµ·å\8b\95ã\81\95ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81ªã\82\8bã\80\82
.in +4n
.nf
.in
.PP
オフセット引き数は 64 ビットで、最初の引き数 (\fIfd\fP) は \fIr0\fP で渡されるので、呼び出し側では手動で 64
-ビット値を分割して境界を合わせて、 64 ビット値が \fIr2\fP/\fIr3\fP レジスタペアで渡されるようにしなければならない。このため、 \fIr1\fP
+ã\83\93ã\83\83ã\83\88å\80¤ã\82\92å\88\86å\89²ã\81\97ã\81¦å¢\83ç\95\8cã\82\92å\90\88ã\82\8fã\81\9bã\81¦ã\80\81 64 ã\83\93ã\83\83ã\83\88å\80¤ã\81\8c \fIr2\fP/\fIr3\fP ã\83¬ã\82¸ã\82¹ã\82¿ã\83¼ã\83\9aã\82¢ã\81§æ¸¡ã\81\95ã\82\8cã\82\8bã\82\88ã\81\86ã\81«ã\81\97ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\80\82ã\81\93ã\81®ã\81\9fã\82\81ã\80\81 \fIr1\fP
(2 番目の引数 0) としてダミー値を挿入している。
.\" Mike Frysinger: this issue ends up forcing MIPS
次のシステムコールに影響がある: \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 "Architecture calling conventions"
-Every architecture has its own way of invoking and passing arguments to the
-kernel. The details for various architectures are listed in the two tables
-below.
+.SS アーキテクチャー毎の呼び出し規約
+各アーキテクチャーには、それぞれ独自のシステムコール起動方法とカーネルへの引き数の渡し方がある。 各種のアーキテクチャーの詳細を以下の 2
+つの表にまとめる。
-The first table lists the instruction used to transition to kernel mode,
-(which might not be the fastest or best way to transition to the kernel, so
-you might have to refer to the VDSO), the register used to indicate the
-system call number, and the register used to return the system call result.
+最初の表は、 カーネルモードに遷移するのに使用される命令、 システムコール番号を示すのに使用されるレジスター、
+システムコールの結果を返すのに使用されるレジスターの一覧である (なお、 ここに載っているカーネルモードに遷移するのに使用される命令は、
+カーネルモードに遷移する最速や最善の方法でない場合もあるので、 \fBvdso\fP(7) を参照する必要があるかもしれない)。
.if t \{\
.ft CW
\}
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
+arm/OABI swi NR \- a1 NR はシステムコール番号
+arm/EABI swi 0x0 r7 r0
+arm64 svc #0 x8 x0
blackfin excpt 0x0 P0 R0
i386 int $0x80 eax eax
-ia64 break 0x100000 r15 r10/r8
+ia64 break 0x100000 r15 r8 下記参照
+mips syscall v0 v0 下記参照
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
+sparc/64 t 0x6d g1 o0
x86_64 syscall rax rax
.TE
+.PP
+s390 と s390x では、 NR (システムコール番号) が 256 未満の場合 "svc NR" で NR が直接渡される場合がある。
+
+少ないがいくつかのアーキテクチャーでは、 システムコールの失敗を示す単純な真偽値がレジスターを使って通知される。この用途に ia64 は \fIr10\fP
+を使用し、 mips は \fIa3\fP を使用する。
.if t \{\
.in
.ft P
\}
.PP
-The second table shows the registers used to pass the system call arguments.
+2 つ目の表は、システムコールの引き数を渡すのに使用されるレジスターの一覧である。
.if t \{\
.ft CW
\}
.TS
-l l l l l l l l.
-arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7
+l l2 l2 l2 l2 l2 l2 l2 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
+arm/EABI r0 r1 r2 r3 r4 r5 r6
+arm64 x0 x1 x2 x3 x4 x5 \-
blackfin R0 R1 R2 R3 R4 R5 \-
i386 ebx ecx edx esi edi ebp \-
-ia64 r11 r9 r10 r14 r15 r13 \-
+ia64 out0 out1 out2 out3 out4 out5 \-
+mips/o32 a0 a1 a2 a3 \- \- \- 下記参照
+mips/n32,64 a0 a1 a2 a3 a4 a5 \-
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
+.PP
+mips/o32 のシステムコールの規約では、 ユーザースタックに引き数を 5 個から 8 個渡す。
.if t \{\
.in
.ft P
\}
.PP
-Note that these tables don't cover the entire calling convention\(emsome
-architectures may indiscriminately clobber other registers not listed here.
+これらの表にはすべての呼び出し規約が記載されているわけではない点に注意すること \(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), \fBerrno\fP(3), \fBvdso\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.51 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。