03. kernelとsyscall: ユーザー空間との境界
Linux内部を理解する上で、最重要ポイントが「境界」です。
アプリは直接ハードウェアを触れません。必ずkernelを経由します。
その入口がsyscallです。
syscallは何か
syscallは、ユーザー空間からkernelへ機能を依頼するための窓口です。
- ファイルを開く: open
- 読む: read
- 書く: write
- processを作る: fork/clone
- 通信する: socket/connect/send/recv
図解テキスト
app (nginx/python)
|
| libc wrapper (open, read, write)
v
syscall entry
v
kernel subsystem
- VFS
- scheduler
- net stack
v
device driver
v
hardware
libcは何をしているのか
多くのプログラムは、syscall命令を直接書きません。
libcの関数を通してsyscallを呼びます。
つまり、アプリ -> libc -> kernel という流れです。
手を動かす: straceで見える化
strace -o /tmp/trace.txt ls
head -n 40 /tmp/trace.txt
grep -E 'open|read|write' /tmp/trace.txt | head
この結果をみると、単純なlsでも大量のsyscallを使っていると分かります。
なぜ必要なのか
Web開発でも、次のような場面でsyscall理解が効きます。
- ファイルI/Oが遅い
- ソケットが詰まる
- process生成コストが高い
内部の動きを知ると、原因推定の精度が上がります。
今回理解できたこと
- ユーザー空間とkernel空間は明確に分かれている
- syscallはその境界を越える公式ルート
- libcは便利なラッパーであり、内部ではsyscallに到達する
コメントを残す