はじめに
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: 初版公開