Dev Study
← コース一覧

OSと低レイヤのしくみ

「システムコールを呼ぶと何が起きるのか」「mallocが返したポインタの先には本当にメモリがあるのか」「read()したデータはどこを通ってくるのか」。普段は意識せずに使っているOSの機能について、CPUのレジスタ1本、カーネルの構造体1つのレベルまで降りて、その中で何が起きているかを図で追いかけます。RISC-Vの仕様書とLinuxのman-page・カーネル文書という一次ソースだけを頼りに、丸暗記ではなく「なぜその設計なのか」を再導出できる状態を目指します。

公式ドキュメント: Linux man-pages / RISC-V ISA Specification

RISC-V編

  1. 1
    RISC-Vの命令フォーマット — なぜ即値のビットは散らばっているのか
    32ビット命令の中でレジスタ番号と即値がどこに置かれているか、そしてなぜ即値だけが分断されているのかを図で追っていきましょう。
  2. 2
    RISC-Vのレジスタ — 32本をどう使い分けるか
    RISC-Vの32本の整数レジスタが、呼び出し規約(ABI)の上でどう役割分担しているのかを図で追っていきましょう。
  3. 3
    RISC-Vのトラップ — 割り込みが起きてから戻るまでの一往復
    トラップが起きてから mret で元の場所へ帰り着くまでの一往復を、CSRの値の動きとして図で追っていきましょう。
  4. 4
    CSR — 特権レジスタを読み書きする専用命令
    CSR(制御状態レジスタ)が汎用レジスタとは別のアドレス空間に置かれ、専用の6命令だけで読み書きされる仕組みを図で追っていきましょう。

カーネル境界編

  1. 5
    システムコールの入口 — ユーザーからカーネルへ制御が渡る瞬間
    write() のようなライブラリ関数を呼んでから、カーネルの中の処理が始まるまでに何が起きているのかを図で追っていきましょう。

メモリ編

  1. 6
    ページテーブルウォーク — 仮想アドレスが物理アドレスになるまで
    RISC-V の Sv39 を例に、1つの仮想アドレスが3段のページテーブルを辿って物理アドレスに変わるまでを図で追っていきましょう。
  2. 7
    TLB — なぜ毎回ページテーブルを辿らずに済むのか
    TLB(Translation Lookaside Buffer)が仮想アドレス変換の結果をキャッシュする仕組みを、図で追っていきましょう。
  3. 8
    ページフォルト — 「メモリが無い」ときにカーネルがすること
    ページフォルトが起きてから解決されるまでの流れを図で追っていきましょう。
  4. 9
    fork()が速い理由 — コピーオンライト
    fork()がメモリを複製せずに済ませ、書き込みの瞬間まで複製を先送りする仕組みを図で追っていきましょう。
  5. 10
    mallocの内部 — brkとmmapの使い分け
    glibc の malloc が「ヒープから切り出す」か「mmap で独立した領域を取る」かをどう決めているのか、その判断と理由を図で追っていきましょう。
  6. 11
    freeしたメモリはどこへ行くのか — chunkとbin
    free() したメモリがOSに返らず、glibc malloc の中でどう分類・保管されて次の malloc に再利用されるのかを図で追っていきましょう。
  7. 12
    mallocが成功しても物理メモリはまだ無い — デマンドページング
    仮想メモリを確保する瞬間と、物理メモリが割り当てられる瞬間がどれだけズレているかを図で追っていきましょう。
  8. 13
    カーネル側のメモリ確保 — バディとスラブ
    カーネルが物理ページとカーネルオブジェクトをどう確保するかを、2段構えの仕組みとして図で追っていきましょう。

同期編

  1. 14
    futex — 競合しないロックがシステムコールを呼ばない仕組み
    ロックを取るとき、なぜ普段はカーネルに降りなくて済むのかを図で追っていきましょう。
  2. 15
    アトミック命令 — なぜCASが同期の土台になるのか
    compare-and-swap(CAS)が「比べて、一致したときだけ書き換える」を不可分に行う仕組みを図で追っていきましょう。
  3. 16
    読み手を待たせない同期 — seqlockとRCU
    読み手にロックを取らせない2つの仕組み、seqlockとRCUを図で追っていきましょう。
  4. 17
    メモリバリア — 書いた順に見えるとは限らない
    ソースコードに書いた順番と、他のCPUから見える順番がズレる仕組みと、それを止めるメモリバリアを図で追っていきましょう。

ファイル編

  1. 18
    read()を呼んでからデータが届くまで — VFSとページキャッシュ
    read() が返るまでにカーネルの中でどこを通っているのかを、図で追っていきましょう。
  2. 19
    write()が返ってもディスクには無い — fsyncと耐久性
    write()が成功して返った瞬間、データがどこまで進んでいるのかを図で追っていきましょう。
  3. 20
    ジャーナリング — 途中で電源が落ちても壊れない仕組み
    ファイルシステムが「書いている途中で電源が落ちても壊れない」ようにジャーナルを使う仕組みを、図で追っていきましょう。