はじめに

LPIC201にて出題されるカーネルソースコードのディレクトリ構成について学習する。 なお、執筆時の環境がWSLのため、実機検証はなし。概念理解に留める。 (カーネルソースコードを改めてインストールするのはオーバーだと判断)

カーネルソースコードの概要

カーネル(OSの中核、ハードウェアとアプリケーションの仲介役)のソースコードは /usr/src/linuxに配置されている。

/usr/src/
├── linux  ─ symlink ─►  linux-2.6.38/   ← 実体(中身は後述)
├── linux-2.6.38/   ← 現用バージョン
├── linux-2.6.32/   ← 旧バージョン(残置可)
└── linux-3.0.0/    ← 新バージョン(切替準備中)

/usr/src/linux/はシンボリックリンクのため、カーネル実体はlinux-2.6.38/などに配置されている。

/usr/

  • 共有可能・読み取り専用のシステムリソース置き場
  • 元々は “user”(初期 UNIX で各ユーザーのホームディレクトリ群を置いていた名残)
  • 現代の FHS では “Unix System Resources” と再解釈されている
  • ユーザー(人)のデータは置かない(それは /home/)

/usr/src/

  • システムソフトウェアの ソースコード置き場
  • FHSにおいて、オプション扱いのため必ずあるディレクトリという訳ではない

/usr/src/linux/

  • Linuxカーネルを再ビルドするためのソースコード一式の格納先

カーネルソースコードの各ディレクトリ・ファイル

/usr/src/linux/
├── arch/          ← アーキテクチャ固有コード(CPUアーキ依存コード)
├── drivers/       ← デバイスドライバ
├── fs/            ← ファイルシステム
├── include/       ← ヘッダファイル
├── kernel/        ← カーネル本体ソース
├── mm/            ← メモリ管理
├── net/           ← ネットワーク
├── Documentation/ ← ビルド/設定ドキュメント
├── Makefile       ← バージョン+ビルド設定
└── .config        ← 現在のビルド設定

arch/

マルチアーキテクチャ対応OS(x86, ARM, RISC-V, PowerPC, MIPS, s390など)において、CPUに直接触る低レイヤだけを集めた隔離区画。共通化できないためarch/<CPU名>/ 配下に隔離されている。

drivers/

カーネルと周辺ハードウェアの間を仲介するコードの格納場所。 ハード制御・割り込み処理・上位レイヤへの抽象API提供の3つの役割を担う。 drivers/net/(NIC)、drivers/usb/drivers/scsi/ などサブカテゴリで整理されており、カーネルソース全体の半分以上を占める最大ディレクトリ。 多くはローダブルモジュール(.ko)としてビルドされ、/lib/modules/$(uname -r)/ に配置される(modprobe / lsmod 等の操作対象)。

fs/

ファイルシステム実装の格納場所

include/

カーネルソースコードのヘッダファイルの格納場所。 中身は .h で終わるヘッダファイルばかり。 ヘッダファイルとは「XX関数を呼べば、YY処理が実行されるというような記載だけがされている取扱説明書」のようなもの。実装は持たない。 処理の説明をヘッダファイルとしてinclude/に集約すれば、変更や管理を効率化できる。

kernel/

カーネル本体(狭義の核)のソースの格納場所。 ややこしいが /usr/src/linux/ 全体も「広義のカーネル」のため、kernel という名前が2回出てくる構造になっている。狭義の kernel/ は他の専門ディレクトリ(arch/, drivers/, fs/, mm/, net/)でカバーされない汎用コア機能を担当する。 具体的にはプロセススケジューラ(sched/)、プロセス生成(fork.c)、シグナル処理(signal.c)、モジュール管理(module.c)など。OSの5大機能のうち「プロセス管理」担当の専用部屋といえる。

mm/

カーネルにおけるメモリ管理のサブシステムの格納場所。

net/

カーネルのネットワークプロトコルスタック全体(TCP/IP/UDP/ICMP、ソケットAPI、ルーティング、Netfilterなど)の格納場所。

注意点: NIC(ネットワークインターフェースカード)のハードウェア制御コードは drivers/net/ 側にあり、net/(プロトコル層)と drivers/net/(ハード制御)で責務分離されている。

Documentation/

カーネルのビルドやインストールの際に参照する資料の格納場所。

Makefile

make コマンドの動作およびカーネルのバージョン情報の記述ファイル。

.config

現在のビルドオプション設定の記述ファイル。

Makefile と .config の関係

Makefile と .config は協調動作する関係にある。Makefile が「ビルド全体の指揮(手順・順序・バージョン定義)」を担当し、.config が「何をビルドするかの選定(機能のON/OFF)」を担当する。両方そろって初めてビルドが成立する。

たとえるなら、Makefile が オーケストラの指揮者、.config が 演奏する曲のセットリスト に相当する。

変更履歴

  • 2026-05-12: 初版公開