File: syscall.2

package info (click to toggle)
manpages-ja 0.5.0.0.20210215%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 28,568 kB
  • sloc: perl: 161; makefile: 58
file content (204 lines) | stat: -rw-r--r-- 9,742 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
.\" 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:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgement:
.\"	This product includes software developed by the University of
.\"	California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\"    may be used to endorse or promote products derived from this software
.\"    without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" 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
.\" 2015-01-17, Kees Cook <keescook@chromium.org>
.\"	Added mips and arm64.
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" 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 書式
.nf
\fB#define _GNU_SOURCE\fP         /* feature_test_macros(7) 参照 */
\fB#include <unistd.h>\fP
\fB#include <sys/syscall.h>   \fP/* SYS_xxx の定義用 */

\fBlong syscall(long \fP\fInumber\fP\fB, ...);\fP
.fi
.SH 説明
\fBsyscall\fP() は、システムコールを起動する小さなライブラリ関数で、 \fInumber\fP
で指定されたアセンブリ言語インターフェースのシステムコールを、指定された引き数をつけて実行する。 \fBsyscall\fP() が役に立つのは、例えば C
ライブラリにラッパー関数が存在しないシステムコールを呼び出したい場合である。

\fBsyscall\fP() は、システムコールを行う前に CPU
レジスターを保存し、システムコールから返った際にレジスターを復元し、エラーが発生した場合はシステムコールが返したエラーコードを \fBerrno\fP(3)
に格納する。

システムコールのシンボル定数は、ヘッダーファイル \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
arm64	svc #0	x8	x0
blackfin	excpt 0x0	P0	R0
i386	int $0x80	eax	eax
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
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
2 つ目の表は、システムコールの引き数を渡すのに使用されるレジスターの一覧である。
.if  t \{\
.ft CW
\}
.TS
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	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	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
これらの表にはすべての呼び出し規約が記載されているわけではない点に注意すること \(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, SIGHUP);
}
.fi
.SH 関連項目
\fB_syscall\fP(2), \fBintro\fP(2), \fBsyscalls\fP(2), \fBerrno\fP(3), \fBvdso\fP(7)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。