Linux Syscalls - GawinGowin/libasm GitHub Wiki
Linux システムコール番号一覧
システムコールとは
システムコールは、ユーザープログラムがカーネル(OS)の機能を利用するためのインターフェースです。
アセンブリでは syscall
命令を使用してシステムコールを呼び出します。
基本的な呼び出し方法
mov rax, システムコール番号
mov rdi, 第1引数
mov rsi, 第2引数
mov rdx, 第3引数
mov r10, 第4引数
mov r8, 第5引数
mov r9, 第6引数
syscall
よく使用されるシステムコール
ファイル操作
番号 |
名前 |
説明 |
第1引数(rdi) |
第2引数(rsi) |
第3引数(rdx) |
0 |
sys_read |
ファイルから読み込み |
fd |
バッファ |
バイト数 |
1 |
sys_write |
ファイルに書き込み |
fd |
バッファ |
バイト数 |
2 |
sys_open |
ファイルを開く |
パス |
フラグ |
モード |
3 |
sys_close |
ファイルを閉じる |
fd |
- |
- |
プロセス管理
番号 |
名前 |
説明 |
第1引数(rdi) |
第2引数(rsi) |
第3引数(rdx) |
57 |
sys_fork |
プロセスを複製 |
- |
- |
- |
59 |
sys_execve |
プログラムを実行 |
パス |
argv |
envp |
60 |
sys_exit |
プロセス終了 |
終了ステータス |
- |
- |
61 |
sys_wait4 |
子プロセス待機 |
pid |
status |
options |
メモリ管理
番号 |
名前 |
説明 |
第1引数(rdi) |
第2引数(rsi) |
第3引数(rdx) |
9 |
sys_mmap |
メモリマッピング |
アドレス |
サイズ |
保護 |
11 |
sys_munmap |
メモリマッピング解除 |
アドレス |
サイズ |
- |
12 |
sys_brk |
ヒープ境界変更 |
アドレス |
- |
- |
標準的なファイルディスクリプタ
値 |
名前 |
説明 |
0 |
stdin |
標準入力 |
1 |
stdout |
標準出力 |
2 |
stderr |
標準エラー出力 |
実例
Hello World(write + exit)
section .data
msg db 'Hello, World!', 0xA
len equ $ - msg
section .text
global _start
_start:
; write(1, msg, len)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, msg ; メッセージ
mov rdx, len ; 長さ
syscall
; exit(0)
mov rax, 60 ; sys_exit
mov rdi, 0 ; 正常終了
syscall
ファイル読み込み例
; open("file.txt", O_RDONLY)
mov rax, 2 ; sys_open
mov rdi, filename
mov rsi, 0 ; O_RDONLY
mov rdx, 0 ; モード不要
syscall
mov r8, rax ; fdを保存
; read(fd, buffer, 100)
mov rax, 0 ; sys_read
mov rdi, r8 ; fd
mov rsi, buffer
mov rdx, 100 ; 100バイト読み込み
syscall
; close(fd)
mov rax, 3 ; sys_close
mov rdi, r8 ; fd
syscall
戻り値について
- システムコールの戻り値は
rax
レジスタに格納されます
- 成功時:通常は処理したバイト数やファイルディスクリプタなど
- エラー時:負の値(-errno)が返される
注意点
- 引数の順序: rdi, rsi, rdx, r10, r8, r9 の順番で渡す
- 呼び出し規約: System V AMD64 ABI に従う
- エラーハンドリング: 戻り値が負の場合はエラー
- レジスタ保護: システムコール後、一部レジスタの値が変更される可能性
参考資料
- Linux カーネルソース:
arch/x86/entry/syscalls/syscall_64.tbl
- man ページ:
man 2 syscall
- System V AMD64 ABI 仕様書