---
title: Linux カーネル：プログラム実行の軌跡を辿って学ぶ
url: https://doc.liz6.com/ja/linux-kernel/00-learning-path
locale: ja
area: linux-kernel
tags:
- Linux カーネル
date: 2026-09-12
modified: 2026-09-12
description: C のポインタ、構造体、基本的な並行コードを読み解き、Linux 上で小さなプログラムをコンパイル・実行できる読者を対象とします。ユーザー空間のプロセス、ファイルディスクリプタ、システムコールについて理解していることを前提とします。これらが不足している場合は、まず[システムプログラミングの学習パス](../systems-programming/00-learning-path.md)を進めてください。カーネルのバージョンによって構造やパスが異なるため、ソースコードを読む際には使用しているバージョンを記録し、特定フィールドを永続的なインターフェースとして扱わないようにしてください。
---

# Linux カーネル：プログラム実行の軌跡を辿って学ぶ

C のポインタ、構造体、基本的な並行コードを読み解き、Linux 上で小さなプログラムをコンパイル・実行できる読者を対象とします。ユーザー空間のプロセス、ファイルディスクリプタ、システムコールについて理解していることを前提とします。これらが不足している場合は、まず[システムプログラミングの学習パス](../systems-programming/00-learning-path.md)を進めてください。カーネルのバージョンによって構造やパスが異なるため、ソースコードを読む際には使用しているバージョンを記録し、特定フィールドを永続的なインターフェースとして扱わないようにしてください。

## 学習目標

「プログラムの起動、メモリへのアクセス、ファイルの読み取り、ブロックとウェイクアップ」を中心にカーネルの役割を説明し、その説明を裏付ける再現可能な観測データを用いることができるようになります。

## 必読順と理解の確認

1. [task_struct とプロセスのライフサイクル](01-process-management/01-task-struct-and-process-lifecycle.md) → [仮想メモリ：1つのメモリアクセス命令からページテーブル、ページフォルト、TLB を理解する](02-memory-management/01-virtual-memory.md)。

   プロセスの起動と、あるメモリページへの最初のアクセスから入ります。理解の確認：仮想アドレス、ページテーブルマッピング、ページフォルト、そしてデータそのものを区別できるか；プロセスの状態と実行スレッドの関係を指摘できるか。

2. [VFS：パス名から開かれたファイルへ](03-file-system/01-VFS.md) → [ブロックデバイス層](07-block-device-layer/01-block-device-layer.md)。

   小さなプログラムの `open`/`read`/`close` を追跡し、パス名解決、ファイルオープン、キャッシュ、デバイス要求を分離します。理解の確認：再読み取りが必ずしも新しいデバイス I/O を引き起こすわけではない。どのレイヤーでヒットしたのかを観測に基づいて説明できるか。

3. [ロック機構とメモリ順序](05-synchronization-mechanisms/01-locking-mechanisms.md) → [eBPF 基礎](08-ebpf-and-observability/01-ebpf-basics.md) → [デバッグとテスト](11-kernel-development-and-build/02-debugging-and-testing.md)。

   まず共有オブジェクト、ライフサイクル、実行コンテキストを特定し、その後に観察ツールを選択します。理解の確認：1回の待機と1回のビジーウェイトの違いは何か；観測された呼び出し回数から直接ロックの正しさを導き出せない理由を説明できるか。

## 発展学習

[RCU](05-synchronization-mechanisms/02-RCU.md) はライフサイクルとメモリ順序の後に読むべきです。コンテナについては [namespaces](12-containers-and-primitives/01-namespaces.md) と [cgroup](12-containers-and-primitives/02-cgroup.md) を通じて学びます。ネットワークについては [プロトコルスタック概要](06-network-subsystem/01-network-protocol-stack-overview.md) を通じて学びます。ドライバ、DMA、KVM、電源管理は実際の問題に応じて入り込むべきものであり、最初のプログラムの前提条件ではありません。

## 仕上げの課題

ファイルを開き、2回読み取る小さなプログラム、実行環境とカーネルバージョン、システムコールまたはトレース出力、そしてユーザー空間からカーネル空間への説明を含む成果物を提出してください。「この出力だけでは証明できない」という結論を少なくとも1つ記述してください。パフォーマンスの問題については[待ち行列理論](../theory/03-queueing-theory/index.md)に続き、リソース利用率とキュー待ちを区別することから始めます。

初めて読むときでは、長い証明や実装の詳細は飛ばしても構いませんが、各段階の理解の確認を完了してください。「用語は知っているが結果を説明できない」という状況に陥った場合は、現在の例で条件を1つ変更して再度試した後、次の章に進んでください。ディレクトリ全体を事前に通読する必要はありません。
