名 前
syscall − 間 接 シ ス テ ム コ ー ル
書 式
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <unistd.h>
#include <sys/syscall.h> /* SYS_xxx の
定 義 用 */
long syscall(long number, ...);
説 明
syscall() は 、 シ ス テ ム コ ー ル を 起 動 す る 小 さ な ラ イ ブ ラ リ 関 数 で 、 number で 指 定 さ れ た ア セ ン ブ リ 言 語 イ ン タ ー フ ェ ー ス の シ ス テ ム コ ー ル を 、 指 定 さ れ た 引 き 数 を つ け て 実 行 す る 。 syscall() が 役 に 立 つ の は 、 例 え ば C ラ イ ブ ラ リ に ラ ッ パ ー 関 数 が 存 在 し な い シ ス テ ム コ ー ル を 呼 び 出 し た い 場 合 で あ る 。
syscall() は 、 シ ス テ ム コ ー ル を 行 う 前 に CPU レ ジ ス タ ー を 保 存 し 、 シ ス テ ム コ ー ル か ら 返 っ た 際 に レ ジ ス タ ー を 復 元 し 、 エ ラ ー が 発 生 し た 場 合 は シ ス テ ム コ ー ル が 返 し た エ ラ ー コ ー ド を errno(3) に 格 納 す る 。 シ ス テ ム コ ー ル の シ ン ボ ル 定 数 は 、 ヘ ッ ダ ー フ ァ イ ル <sys/syscall.h> に 書 か れ て い る 。
返 り 値
返 り 値 は 呼 び 出 さ れ た シ ス テ ム コ ー ル に よ っ て 定 義 さ れ る 。 一 般 に 、 返 り 値 0 は 成 功 を 表 す 。 −1 は エ ラ ー を 表 し 、 エ ラ ー コ ー ド は errno に 入 れ ら れ る 。
注 意
syscall() は 4BSD で 最 初 に 登 場 し た 。 ア ー キ テ ク チ ャ ー 固 有 の 要 件 各 ア ー キ テ ク チ ャ ー の ABI に は 、 シ ス テ ム コ ー ル の 引 き 数 の カ ー ネ ル へ の 渡 し 方 に 関 す る 独 自 の 要 件 が あ る 。 (ほ と ん ど の シ ス テ ム コ ー ル の よ う に ) glibc ラ ッ パ ー 関 数 が あ る シ ス テ ム コ ー ル で は 、 glibc が 詳 細 を 処 理 し 、 ア ー キ テ ク チ ャ ー に 応 じ た 方 法 で 引 き 数 が 適 切 な レ ジ ス タ ー に コ ピ ー さ れ る 。 し か し 、 シ ス テ ム コ ー ル を 呼 び 出 す の に syscall() を 使 う 場 合 に は 、 呼 び 出 し 側 で ア ー キ テ ク チ ャ ー 依 存 の 詳 細 を 処 理 し な け れ ば な ら な い 場 合 が あ る 。 こ れ は い く つ か の 32 ビ ッ ト ア ー キ テ ク チ ャ ー で は 非 常 に よ く あ る こ と だ 。 例 え ば 、 ARM ア ー キ テ ク チ ャ ー の Embedded ABI (EABI) で は 、 (long long な ど の ) 64 ビ ッ ト 値 は 偶 数 番 地 の レ ジ ス タ ー の ペ ア に 境 界 が あ っ て い な け れ ば な ら な い 。 し た が っ て 、 glibc が 提 供 す る ラ ッ パ ー 関 数 で は な く syscall() を 使 う 場 合 に は 、 readahead() シ ス テ ム コ ー ル は ARM ア ー キ テ ク チ ャ ー の EABI で は 以 下 の よ う に し て 起 動 さ れ る こ と に な る 。
syscall(SYS_readahead,
fd, 0,
(unsigned int) (offset >> 32),
(unsigned int) (offset & 0xFFFFFFFF),
count); オ フ セ ッ ト
引 き 数 は 64 ビ ッ
ト で 、 最 初 の
引 き 数 (fd) は r0
で 渡 さ れ る の
で 、 呼 び 出 し
側 で は 手 動 で 64
ビ ッ ト 値 を 分
割 し て 境 界 を
合 わ せ て 、 64 ビ
ッ ト 値 が r2/r3
レ ジ ス タ ー ペ
ア で 渡 さ れ る
よ う に し な け
れ ば な ら な い
。 こ の た め 、
r1 (2 番 目 の 引 数 0)
と し て ダ ミ ー
値 を 挿 入 し て
い る 。 同 様 の
こ と が 、 MIPS の O32
ABI、 PowerPC の 32 ビ ッ ト
ABI や Xtensa で も 起 こ
り う る 。 次 の
シ ス テ ム コ ー
ル に 影 響 が あ
る : fadvise64_64(2), ftruncate64(2),
posix_fadvise(2), pread64(2),
pwrite64(2), readahead(2),
sync_file_range(2), truncate64(2) ア
ー キ テ ク チ ャ
ー 毎 の 呼 び 出
し 規 約 各 ア ー
キ テ ク チ ャ ー
に は 、 そ れ ぞ
れ 独 自 の シ ス
テ ム コ ー ル 起
動 方 法 と カ ー
ネ ル へ の 引 き
数 の 渡 し 方 が
あ る 。 各 種 の
ア ー キ テ ク チ
ャ ー の 詳 細 を
以 下 の 2 つ の 表
に ま と め る 。
最 初 の 表 は 、
カ ー ネ ル モ ー
ド に 遷 移 す る
の に 使 用 さ れ
る 命 令 、 シ ス
テ ム コ ー ル 番
号 を 示 す の に
使 用 さ れ る レ
ジ ス タ ー 、 シ
ス テ ム コ ー ル
の 結 果 を 返 す
の に 使 用 さ れ
る レ ジ ス タ ー
の 一 覧 で あ る
(な お 、 こ こ に
載 っ て い る カ
ー ネ ル モ ー ド
に 遷 移 す る の
に 使 用 さ れ る
命 令 は 、 カ ー
ネ ル モ ー ド に
遷 移 す る 最 速
や 最 善 の 方 法
で な い 場 合 も
あ る の で 、 vdso(7)
を 参 照 す る 必
要 が あ る か も
し れ な い )。
s390 と s390x で は 、 NR (シ ス テ ム コ ー ル 番 号 ) が 256 未 満 の 場 合 "svc NR" で NR が 直 接 渡 さ れ る 場 合 が あ る 。 少 な い が い く つ か の ア ー キ テ ク チ ャ ー で は 、 シ ス テ ム コ ー ル の 失 敗 を 示 す 単 純 な 真 偽 値 が レ ジ ス タ ー を 使 っ て 通 知 さ れ る 。 こ の 用 途 に ia64 は r10 を 使 用 し 、 mips は a3 を 使 用 す る 。
2 つ 目 の 表 は 、 シ ス テ ム コ ー ル の 引 き 数 を 渡 す の に 使 用 さ れ る レ ジ ス タ ー の 一 覧 で あ る 。
mips/o32 の シ ス テ ム コ ー ル の 規 約 で は 、 ユ ー ザ ー ス タ ッ ク に 引 き 数 を 5 個 か ら 8 個 渡 す 。 こ れ ら の 表 に は す べ て の 呼 び 出 し 規 約 が 記 載 さ れ て い る わ け で は な い 点 に 注 意 す る こ と — ア ー キ テ ク チ ャ ー に よ っ て は 、 こ こ に 記 載 さ れ て い な い 他 の レ ジ ス タ ー が 見 境 な く 上 書 き さ れ る 場 合 も あ る 。
例
#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); }
関 連 項 目
_syscall(2), intro(2), syscalls(2), errno(3), vdso(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。