システムコール
ユーザー空間からカーネル機能を呼び出す
システムコールとは
システムコール(syscall)は、ユーザー空間のプログラムがカーネルの機能を利用するためのインターフェースです。 ファイル操作、プロセス生成、ネットワーク通信など、ハードウェアリソースへのアクセスは すべてシステムコールを通じて行われます。
システムコールの流れ
- 1アプリケーションがライブラリ関数を呼び出し
例: fopen() → glibc
- 2ライブラリがシステムコールを発行
例: open() syscall
- 3CPUがカーネルモードに遷移
ソフトウェア割り込み(syscall命令)
- 4カーネルが処理を実行
ファイルオープン処理など
- 5ユーザーモードに復帰、結果を返す
ファイルディスクリプタ or エラー
主要なシステムコール
| カテゴリ | システムコール | 説明 |
|---|---|---|
| ファイル | open | ファイルを開く |
| read/write | 読み書き | |
| close | ファイルを閉じる | |
| stat | ファイル情報取得 | |
| プロセス | fork | プロセス複製 |
| exec | プログラム実行 | |
| exit | プロセス終了 | |
| wait | 子プロセス待機 | |
| メモリ | mmap | メモリマッピング |
| brk | ヒープ拡張 | |
| munmap | マッピング解除 | |
| ネットワーク | socket | ソケット作成 |
| connect/accept | 接続 |
straceによるシステムコール追跡
straceはプログラムが発行するシステムコールを追跡するツール。 デバッグやパフォーマンス分析に非常に有用です。
1 # 基本的な使い方 2 strace ls 3 4 # プロセスにアタッチ 5 strace -p <PID> 6 7 # 特定のシステムコールのみ 8 strace -e open,read,write ls 9 10 # サマリー表示 11 strace -c ls 12 13 # 出力例 14 # % time seconds usecs/call calls errors syscall 15 # ------ ----------- ----------- --------- --------- ---------------- 16 # 25.00 0.000025 2 10 read 17 # 20.00 0.000020 1 15 write 18 # ... 19 20 # タイムスタンプ付き 21 strace -t ls 22 23 # ファイルに出力 24 strace -o trace.log ls
ユーザーモード vs カーネルモード
ユーザーモード(Ring 3)
- • 制限された権限
- • 直接ハードウェアアクセス不可
- • アプリケーションが動作
- • クラッシュしても他に影響少
カーネルモード(Ring 0)
- • 全権限
- • ハードウェア直接アクセス
- • カーネルコードが動作
- • 不具合はシステム全体に影響
SRE/インフラ観点
パフォーマンス分析
- •
strace -cでボトルネック特定 - • 過剰なsyscallはオーバーヘッドに
- • I/O待ちの可視化
セキュリティ
- • seccompでsyscall制限(コンテナセキュリティ)
- • auditdでsyscall監査