03. kernelとsyscall: ユーザー空間との境界

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に到達する

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です