新Linuxカーネル解読室の現在地

新Linuxカーネル解読室のブログ連載が始まってから1年が経ちました。
本記事では、ブログ連載1周年を記念して、新Linuxカーネル解読室プロジェクト(以降、本PJ)がはじまった経緯や今後の方針、および執筆の裏側についてお話します。

執筆者 : 稲葉 貴昭

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


新Linuxカーネル解読室のはじまり

本PJの話が最初に出たのは2024年3月26日、年度末の飲み会での何気ない会話からでした。

「解読室の改訂版を作りたい!」(高橋)  
「あーなるほどぉ」(稲葉)  
「VAのプレゼンス向上にもなるし、やろうやろう」(狭間)  
「ははは(ま、酒回ってるし、寝て起きたら忘れているだろう)」(稲葉)  

(数日後)

「あれ、開始はいつからにする?」(高橋)  
「なぬぅぅ!!!」(稲葉)  

本PJは、こんな感じで飲み会ノリが発端となっています。
社内で仲間を募ったらすぐに3名集まり、私をいれて調査・執筆をするメンバーが4名、旧版の執筆者2名がレビュアとなり、計6名体制の船出となりました。 *1

各メンバーは旧版Part1(カーネルプリミティブ)担当と旧版Part5(ネットワーク)担当の2チームに分かれて作業しております。

PJの最終目標

本PJの最終目標は、「旧版のようなLinuxカーネルの機能を網羅的かつ詳細にまとめた本を出版すること」です。 昨年度は暗中模索状態で、最終目標が出版であることを対外的に公表していなかったので、いきなりのサプライズかもしれません。
私の知る限り、Linuxカーネルのコアの部分を詳細に解説した本は2010年以降は世界的にほぼ出版されていないので、私自身はなかなか無謀なロマン溢れる目標と思っております。 ちなみに2010年以前は、「Understanding the Linux Kernel」(詳解Linuxカーネルの原著)など参考書にも枕にも使える素敵な本がしばしば出版されていたのですが、 Linuxカーネルの大規模かつ複雑化が進み、最近は英語も含めぱったりと出版されなくなりました。(入門書であれば日本語でもそこそこあります) 2010年以降は、デバイスドライバを含むカーネルモジュールを作る人向けの解説書など、一部の機能に特化した本が数年に1冊出版されるくらいで、世界中で日々使われているにも関わらず 勉強資料が極めて少ないのが現状です。*2

技術ブログ記事の反響

本PJの最終目標である本の出版には、少なくとも数年はかかると当初から見込んでおり、出版まで対外的なアウトプットなく続けるのはモチベーションの維持が難しそうだったため、 なるべく小さな単位でブログ記事にして公開する方針としました。

6月に「Linuxカーネル解読室 再び」というタイトルで 最初の記事 をリリースしたところ、Xを中心に想像以上の反響をいただきました。 その後リリースした記事もはてなブログのランキングに多数ランクインしており、この反響の大きさやXなどでのポジティブな意見がメンバーのモチベーション向上に大きく寄与しています。

1つの記事ができるまで

「新Linuxカーネル解読室」のブログ記事は、公開するまでに以下の3つの工程があります。

(1)調査
調査工程は、まず機能単位で調査する箇所としない箇所を選別します。 例えば、ネットワークでいうとIPフラグメントは昨今使われるケースが少ないため、この段階で調査範囲から除外しました。
次にコードレベルで調査する分岐と調査しない分岐を選別していきます。 選別のやり方は人によって異なりますが、私の場合だとエラー処理やunlikely付きの分岐は基本的に除外しています。 調査する箇所が決まったら、コードをじっくり眺めるのはもちろんですが、それに加えて参考になる資料やコミットログを読んだり、 *3 tracerを使うなどして少しずつコードの理解を深めていきます。
最終的には、調査したコードから、ここは重要だな、ここは皆さんに伝えたいなと思った箇所を決めるまでを調査工程で行っています。

(2)執筆
調査工程が完了したら、あとはそれを文章にするだけなのでゴールは近いかと思われるかもしれませんが、実はこの執筆工程が最も時間がかかります。 調査工程では、コードを読み、自分の頭の中だけでロジックを理解すればよいのですが、その脳内ロジックを日本語にそのまま変換すると非常に醜い記事になります。 読者が読みやすく、理解しやすい記事にするために、解説のストーリーを考え、説明するロジックを抽象化したり、重要な箇所は図にするなどの工夫をしています。

(3)レビュー
最後のレビュー工程では、誤字脱字チェックや用語の統一に加え、読みやすい構成になっているかなど読者目線のレビューを行います。 また、執筆者以外のメンバーが内容に誤りがないかの確認も行っています。 記事によっては、コードの机上確認のみならず、解説している処理がきちんと呼ばれるかをtracerで再確認(細かいロジックすべてを調査段階で検証できないため)したり、 解説している処理に入る条件が複雑な箇所は、テスト用のカーネルモジュールを作るなどなるべく正しい情報が読者の皆さんに届くように努力しています。

記事にもよりますが、例えば私が携わった 最近の記事 だと調査2週間、執筆4か月、レビュー2週間くらいの時間がかかっています。

開発合宿

1つの記事を作るまでにけっこうな労力がかかることは伝わったかと思いますが、作業時間の確保も大変悩ましい問題です。
本PJに携わっているメンバーは普段は各自案件を抱えているため、本PJの作業は空き時間を利用して行っております。 といっても空き時間を作るのが難しいときもあるので、1か月間ほぼ進捗がないこともしばしばあります。

こういった背景もあり、最近は有志を募って2泊3日の開発合宿を定期的に行っております。

自然豊かで静かな(かつ美味しいご飯と温泉がある)場所で、体力が尽きるまでコードを読込み、知見を共有し合い、知識を深めていく楽しい行事となっています。

今後について

さて、ここまで読まれた方は、苦労しながらも順調に進んでいるなという印象を持っていただけているかもしれません。
しかしながらこの1年の進捗状況を鑑みると、「Linuxカーネルの機能を網羅的かつ詳細にまとめた本を出版」できるまで、楽観的に見積もっても10年程度はかかる見込みです。 副業的な位置づけである本PJを10年続けるのは、モチベーションの維持や調査しているコードが古くなっていくなど様々なリスクがあります。 *4
ということで、旧版のような網羅的な本ではなく、ネットワークに限定した本の出版を目指すことにしました。

今秋くらいまでにあと数本ほどネットワーク以外の記事がリリースされる予定ですが、それ以降は本PJに関わるメンバー全員がネットワークに注力します。
スケジューラや割り込みなど旧版Part1の内容は、ネットワークの内容を出版後に再開する予定で、こちらもいずれは本を出版したいと考えています。

おわりに

クラウドやWebフレームワークを使えば、立派なシステムを簡単に作れてしまう現代において、残念ながらLinuxカーネルはIT技術の話題の中心ではありません。 しかし、それらの高度に抽象化された技術は、Linuxカーネルなど低レイヤな技術の上で動いています。 Linuxカーネルは、上位レイヤの技術が安定的かつ効率よく動くように、世界中のトップエンジニアが長い年月をかけて築き上げた、まさに人類の叡智です。 その内部は、無数の工夫や知恵、情熱が詰まっており、知れば知るほど驚きと発見に満ちています。 そんな魅力あふれるLinuxカーネルの世界を、正確にわかりやすく届けるべくこれからも発信を続けていきます。 読者の皆さん、これからもどうぞ期待してお待ちいただければ幸いです。

*1:現在では計9名の体制となり、社内のエンジニアの約半数が携わっています。ちなみにLinuxカーネル界隈は近年高齢化が問題となっていますが、本PJのメンバーの過半数は若手(平成生まれ)で構成されています。

*2:ちなみに今年の年末にメモリ管理に特化したかなり詳しい(1300ページの超大作)本が出版されるようです

*3:カーネルに関する新しめの資料は本当に少ないため、英語、中国語関係なくあらゆる言語の資料を探しています(最近は中国語の資料が増えている印象があります)。ちなみに生成AIはカーネルのコードに関する質問には、まだ誤回答が多いです。

*4:本PJを開始したときはUbuntu 24.04 LTSがリリースされた直後だったため、調査するカーネルのバージョンを6.8としましたが、今後の出版を見据えて近々調査するカーネルのバージョンを6.14(Ubuntu 25.04がサポートしているバージョン)に変更します。 既に調査済みのものはそのまま6.8の内容で記事にする予定で、最終的には出版時になるべく新しいバージョンに統一する予定です。