🔖

Linux カーネルのコードリーディングを再現可能にする

に公開

要約

  • Linuxカーネルのコードリーディングの関数追跡を可視化するウェブサイトを作った。https://linux.tokyo (PCで見てください)
  • とりあえず「write」だけ可視化したが、今後は全カーネルの機能制覇を目指す(driver全制覇は別にいいかな...)
  • Linux Reader というVSCode拡張機能を使ったよ

難しいLinuxカーネルのコードリーディング

Linuxカーネルのコードリーディングは、とてもとても難しいです。
多くのOS初学者は、以下のようなところでつまづくことでしょう。

  1. 意味の分からない最新の情報
  2. 深すぎる関数追跡
  3. 深くまで探索した後で覚えていられない関数追跡

とは書いたものの、かくいう私がこの初学者の一人でした。
生成AIが今ほど注目されていなかった2年前くらいに、私もLinuxカーネルを読もうとして見事に挫折しました...
何を読もうとして挫折したかまでは覚えていませんが、「関数の意味も分からない」「関数追跡が正しいかも分からない」「戻れない」の三重苦ははっきり言って苦痛でした。


しかし、今は生成AIがあります。
「永年の願いだったLinuxカーネルのコードを読破する夢が叶う」
そう思って、「Linux Reader」なるVSCode拡張機能を作りました。

https://zenn.dev/coffeecupjp/articles/09eaa20edcf2c0

https://marketplace.visualstudio.com/items?itemName=coffeecupjapan.linux-reader&ssr=false

作ったはいいものの、会社を続けながらLinuxカーネルを読むのは、「時間がない」!

ということで、諸事情があり残念ながら会社まで辞めて(!)、今はLinuxカーネルを読破しようとしているのですが、読んでいく中でLinuxカーネルのコードリーディングの追跡履歴や生成AIの解説をウェブベースで解説できるウェブサービスがあればいいなと思い、それを作ってみました。

https://linux.tokyo

このサイトがあれば、初学者でもLinuxカーネルの関数追跡を大まかに再現できます。つまり、先ほど出てきた難しさに対して以下の効果があります。

  1. 意味の分からない最新の情報 → 生成AIの解説を見れる
  2. 深すぎる関数追跡 → 可視化されているので目で追わなくていい
  3. 深くまで探索した後で覚えていられない関数追跡 → 可視化されているUIでもとに戻れる

今回は手元で「write」システムコールの流れを見て可視化してみたので、今回はその解説だけここでしてみたいと思います。

※「write」から始めたのは、以下のブログに情報が満載で、始めやすかったからです。改めて有益な情報を提供していただき、ありがとうございます。

https://leavatail.hatenablog.com/entry/2021/02/23/000000

linux.tokyo もしくは Linuxカーネルの関数追跡の可視化とは何か?

いきなりですが、全プログラムのコードは究極的に「関数の木構造」で表現できる、と考えたことはありませんか?
関数Aの中に関数B・関数C・関数Dがあり、その中の関数Bの中に関数E・関数F・関数Gがあり・・・これを続けていけば、関数Aをルートノードにした木が出来上がると思います(正確に言えば循環することもあるのですが)。

つまり、この関数の木構造を作りさえすれば、関数追跡も可視化できる。今までは頭の中にしかなかった暗黙知であるコードリーディングの知識は、形式知化できる。そう思うんです。

そこらへんで書いた小ちゃいコードなら、そこまでのコードの可視化は意味はあまりないかもしれません。しかし世界でも巨大と言われている大規模OSS、例えばLinuxやKubernetesやReactなどで、この可視化を実現すれば、今までコードリーディングを諦めていた人たちでもコードが読めるようになるかもしれない...!

これが、私の目指す「関数追跡の可視化」です。

linux.tokyo の使い方

説明だけでは分からないかもしれないので、どういうものか見せましょう

https://linux.tokyo のページに行って、例えば「write(3)」をクリックしてみます。
すると以下のようなページが表示されたのではないでしょうか?

※ PCでの閲覧を推奨します。画面幅が広いと表示が崩れる可能性があります。

この右下の部分が、関数追跡の木構造を表現した部分です。
デフォルトでは大量にデータが表示されて欲しくないので2階層しかデータを表示していませんが、「+」ボタンを押せば中身が展開され、深くまで探索できます。
実はこの探索の木構造は、私が手動で先ほど言ったLinux Reader を使って可視化結果をJSONで保存したものなので、末端のノードで追跡が途切れていますが、「+」を押したり関数名を押したりすれば、ある程度までは深く追跡できると思います。

ただ関数の流れを追跡するだけではありません。関数の追跡をして上でノードである関数をクリックすると、その「関数の中身」と生成AIによる「関数の説明」も表示されます。

そして、「この関数探索の目的」の中にある「主な関数経路」の下にあるボタンをクリックすれば、私が選んだ重要そうな関数追跡の関数が下の木構造に表示されます。

今は「write」システムコールしかなく内容が不十分ですが、今後は(会社も辞めて時間があるので)定期的に内容を追加しようと思っています。実は裏でfork, exec, exitらへんは読んでいたので、そこら辺のシステムコール・IO関係のread, open・mmやschedなど見ていく予定です。
ただ私はLinuxカーネル初学者なので、Linuxカーネルの情報提供してくれる方がいらっしゃったら嬉しいなと思っています。


今回はあくまでも私が関数追跡したものを可視化しただけですが、もちろんこれを読んでいるあなたでも以下のVSCode拡張機能を使えば、関数追跡はできます。OpenAI・Claude・Gemini・PlamoのAPIキーがだけ必要なのでご注意ください。

https://marketplace.visualstudio.com/items?itemName=coffeecupjapan.linux-reader&ssr=false

アーキテクチャ

「探索履歴を保存してあるJSONのS3バケットを読み出すLambda」と、「そのJSONをReactで可視化するウェブのS3バケット・CloudFront・ACMのデプロイ構成」で作りました。
以下のサイトが参考になりました。

https://zenn.dev/msy/articles/8c922e9c142f69

最後に

コードを読むのがつらかった自分が、今はその道筋を可視化できるようになリマした。
もし同じようにLinuxカーネルに挑戦している人がいたら、 このツールがその一歩を支える存在になれば嬉しいです。

今後も「write」システムコール以外にもたくさん機能を「可視化」していきます!是非とも見てください or Linuxカーネルの専門の方がいたらご教授ください!

Discussion