😎

Linuxカーネルを100時間読んでみて

に公開

Linuxカーネル読んだ時間が100時間くらいになりました

ここ2週間くらいで、Linuxカーネルを可視化しようという記事を書いてきました。

https://zenn.dev/coffeecupjp/articles/07f01040a4c7a4

https://linux.tokyo

そもそもは10月中旬から会社を休み辞め、本命で全力を注ぎたかったLinuxカーネル読解を始めたのが始まりなのですが、OpenAIの統計を見るとどうやらそろそろ100時間くらいLinuxカーネルを読んだことになったみたいです。

3.79ドル使った日は10時間以上読解していて、合計37.12ドル使ったので、大体100時間は読解していたのかなという計算です。

なぜ読解なのにOpenAI...?と思う人もいるかもしれませんが、1つ1つのコードの関数の読解に自作VSCode拡張機能「Linux-Reader」を使って読解をしていたので、OpenAIの使用量で計算しました。

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

繰り返しになるかもしれませんが、このVSCode拡張機能で読解した形跡履歴は保存できるので、それを使って linux.tokyo はできています。


さて前置きはこれくらいにして、この記事では100時間Linuxカーネルを読解し、自分の中でどのような部分が変わったかをこの記事では話したいと思います。

100時間読解して変わったこと

「100時間Linuxカーネル読解した!」といっても、0時間の段階ではschedkernel_cloneに関して少し自作VSCode拡張で読んだくらいで、ほぼノー知識でした。

つまり、完全なLinuxカーネルワナビーです笑

ただ、いきなり読むにしては知識がない(Unix V6本を2周しかしたことがない)と思ったので、「[試して理解]Linuxのしくみ-―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識」というLinuxカーネルの本を読んで基礎を固めてから、読み始めました。

https://www.amazon.co.jp/[試して理解]Linuxのしくみ-―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】-武内-覚-ebook/dp/B0BG8J5QJ1?ref_=ast_author_mpb

今、Linuxカーネルを読解していく中で見直すと、なるほどと思う部分もあれば説明が深くないなと思う部分もありましたが、なんとなく概念を頭に入れるには十分でした。のでこの本はおすすめできます。

ただ今思えば、最初はVSCode拡張のサポートがありながらも、読んでいて本当に理解できていたか疑問に思うほどでした(特にwrite)。
とはいえ、write, fork, exec, exit, open, read と少しずつ読んできて、どんどん読み方が分かってきました。
なので、その変化を記録する意味でも、記事にしようと思った次第です。


では早速何が変化したかを見ていきます!

1. いきなり読み始めるのではなく、都度説明をChatGPTに聞き方向性を知った上で読むようになった

最初の頃は、VSCode拡張の補助がありながらも、結構いきなり読み始めることが多かったです。そして、分からない単語があっても、1/2の可能性でググりもしない笑。概念に不慣れだったので、とりあえずコードを読むことが目的になっていました。

ただ、気づいた頃には、最初にChatGPTに関数の場所を一度聞いて全体像を把握してから、詳しい部分を見るようになりました。ちょっと余裕が出てきたおかげかもしれません。

皆様も、大規模コードを読むときは最初はいきなり、むやみやたらに読んでもいいかもしれませんが、ある程度分かったらAIの力を使ってみてもいいかもしれません。

2. 概念がどう組み合わさっているかを想像しながら読めるようになった

次の変化が、今だと読みながら中身の実装、たとえばBlock層に関わるreadの実装だったら「赤黒木」や「folioのxarray」の高速化技法をどう使っているか、意識しながらコードを読めるようになったことです。

最初はと言うと...
何もかも全く分からず、それぞれの構成の関係性を全く考えずに読んでいました。
なので、linux.tokyo のwriteやforkなど最初に書いた部分は、自分でも何をやっているか分からずに書いていたところがあった気がしています。

ただ、openをやり始めるところから概念の組み合わせを意識して読めるようになり、readでも全体的にどういう構成かが分かった整理ができました(整理の可視化方法を検討中ですが...)。

3. VSCode拡張機能のバグを直し、読む利用体験を改善できた

最後の変化は、自作VSCode拡張に関することです。

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

実はこのVSCode拡張機能、この2〜3週間でバージョンを1.0.7から1.0.18にまで上げています。
なぜなら、品質が酷かったからです。
おそらく linux.tokyo を少しでも使っている人なら分かると思うのですが、例えば「#define」のコード内容を正しく捕捉できない部分が昔はありました。それが今でも「write」システムコールの一部では残っています。

そう言うことで、この2〜3週間は、単体テストも導入して本格的に修正に着手しました。今でも100%ミスがないソフトウェアにまではなっていませんが、ある程度は使えるものになっていると思います。

Linuxカーネルを読んだ最初の100時間を振り返って

Linuxカーネルは、ぱっと見、初見さまお断りの相当難易度の高いOSSだと自分は思っていました。しかし実際に生成AIをうまく活用して読むと、それなりに読んだ気になれ、実際に読んで概念を整理できるまでに読めるようになったと思います。

もちろん、自分のような無職でないとこのような時間はなかなか取れないとは思うのですが、linux.tokyo にて、本来は大量に読まないといけないところを、今のところは1システムコールにつき50通りの経路までを読み、解説もできるようになっています。なので、皆様もお時間があったら、生成AIをうまく活用して、Linuxカーネルなり難しいOSSを読破できるようになれるようになれればいいなと思っています。

Discussion