Linuxカーネル解読室 再び

執筆者 : 高橋 浩和

※ 「新Linuxカーネル解読室」連載記事一覧はこちら


Linuxカーネルコード解析プロジェクト立ち上げ

弊社内にて若手技術者が中心となり、最新のLinuxカーネルコード全体を読み解くプロジェクトが進行中です。 解析したコードのうち興味を惹かれたもの、重要そうなものを中心にブログ記事にまとめていく予定です。 詳解LinuxカーネルLinuxカーネル2.6解読室を執筆していたころよりLinuxカーネルは大きく膨れ上がっています。 どこまで辿り着けるかは分かりませんが、気長にお待ちください。

  • 対象Linuxカーネルのバージョンは6.8
    ブログ執筆中に興味深い機能が取り込まれたら、より新しいバージョンのカーネルについて解説するかもしれません。

  • 対象CPUアーキテクチャはx86-64
    ブログ執筆者の趣味により、ARM64やRISC-Vアーキテクチャに依存した話が出ることもありそうです。

  • 分析対象機能
    Linuxカーネルの基本機能、ファイルシステムに加え、ネットワークプロトコルスタックを網羅します。 ブログ記事ではLinuxカーネル2.6解読室レベルの深さの説明を考えていますが、執筆者によっては更に深いマニアックな解説をするでしょう。 ブログ執筆者の気合が入れば、仮想化や名前空間などの機能にも触れるかもしれません。

Linuxカーネル成長の歴史

カーネルの大きさ

Linuxカーネル2.6解読室の執筆を始めたころのLinuxカーネル2.6のコードは600万行程度でしたが、今回解析対象とするカーネル6.8では約3,600万行と6倍ほどのサイズとなっています。カーネルの基本構造は変わっていませんが、スケーラビリティ向上を目的とした数多くの変更が加えられています。

Linuxカーネルコードのライン数

バージョン番号

  • 2.6まで
    1.0リリース以降、根本的な機能アップデートがなされた時にメジャーバージョンを上げることとなっており、それ以外はマイナーバージョンを更新したリリースが行なわれていました。 そのうち偶数のマイナーバージョンを持つものを安定版と呼び、実用途に適したカーネルとされていました。一方奇数のマイナーバージョンを持つカーネルは開発版と呼ばれ、新しい機能追加や試みが次々と取り込まれました。
    このルールでメジャーバージョンを更新したのは1.0と2.0リリースの2回だけです。

  • 2.6
    安定版と開発版を一体化し、開発用の2.7ブランチを作りませんでした。 安定版リリースの間隔が長すぎるという問題を解決するために、2.6ブランチの中で開発を進め、こまめにリリースするというスタイルに切り替わりました。 Linuxカーネルコードのライン数の表にて2.6カーネルと3.0カーネルのコードサイズに大きな差があるのは、2.6カーネルの中で新機能追加とリリースが繰り返されたためです。

  • 3.0から
    カーネルバージョン付与ルールが変更されました。 今までのメジャーバージョンを廃止し、それまでのマイナーバージョンをメジャーバージョンに格上げすることになりました。 メジャーな機能アップデートではありませんが2.6の次の版は3.0とし、これ以降新しいルールを適用することになりました。

この新しいバージョン付与ルールにより、Skynetがアンドロイドに搭載したLinuxカーネル4.1.15も比較的短期間でリリースされることとなりました。2024年現在そのバージョンのカーネルは、既に過去のものとなっています。

SCM導入

  • SCM前夜
    カーネルコードのやりとりはすべてメールベースで行われていました。カーネル開発者はリリースされた最新のLinuxカーネルコード(tar形式で配布)に対する修正パッチを、Linusまたはメンテナ宛にメールで送っていました。 それら送られてくるパッチ群のコンフリクトを解消しLinuxカーネルコードに取り込む作業は最終的にLinusが行なっていました。メンテナの協力があったとはいえ、カーネル開発者が増えるにつれ、Linus自身が開発ボトルネックになってしまいました。

  • BitKeeper
    BitKeeperは商用サービスでしたが、Linuxカーネル開発コミュニティ向けには無料で開放されていました。LinusがBitKeeper利用を宣言し、Linuxカーネル2.5の途中からBitKeeperでのカーネルコード管理が始まりました。SVNやCVSなどとは異なり、BitKeeperはLinuxカーネルのような大規模分散開発に適したSCMでした。Linuxカーネル開発者達は、カーネル開発状況を正確に把握できるようになりました。

  • git
    いろいろとゴタゴタがありBitKeeperの継続利用ができなくなったため、Linuxカーネル開発コミュニティ独自SCMとしてgitを作り上げました。現在ではgitはLinuxカーネル開発以外にも分散開発用途で広く利用されています。 Linuxカーネルのgitレポジトリを覗くと、2.6.12以降のカーネルコードの履歴を容易に辿ることができます。

カーネル機能の変遷

BSD系UNIXが訴訟に巻き込まれて開発が停滞していたり、格好良い設計のHurd(マイクロカーネル型のPosix OS)がいつまで経っても、いつまで待っても完成しないでいる間に、Linuxカーネルは開発者を集めてどんどん進化を続けました。インターネットが丁度普及し始めたころというタイミングも開発を後押ししたように思います。

  • 0.01
    1991/9/17産声を上げる。Linuxの歴史が始まった。
  • 1.1/1.2
    カーネルモジュール機能が組み込まれた。こんなに古いカーネルで実現されていたとは!
  • 2.0
    一通りの機能が揃い実利用可能なOSとなった。
    マスコット Tuxペンギンが登場した。
  • 2.1/2.2
    対応デバイス、対応アーキテクチャの拡充が進んだ。BSD系UNIXより豊富になった。
    マルチコア対応がなされた。
  • 2.3/2.4
    デバイスのホットプラグ機能が実現。USBデバイス登場による必然機能ではあった。
    ジャーナリングファイルシステムext3登場。ファイルシステムの耐障害性が向上した。
  • 2.6
    仮想マシン機能KVM登場。
  • 3.0以降
    スケーラビリティがどんどん向上している。高負荷環境・大規模環境からニッチな環境まで、どこでも効率良く動作するようになった。