Manpages

名 前

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/ に 書 か れ て い る 。