Slide 1

Slide 1 text

カーネルコードの歩き方 May. 24, 2023 Satoru Takeuchi twitter: satoru_takeuchi 1

Slide 2

Slide 2 text

はじめに ● 著者 ○ 社会人一年生から15年くらいカーネル開発 /サポートをやってきた ○ 今も必要に応じてカーネルソースを見ている ● 本LTで学べること ○ Linuxのカーネルソースの読み方についての勘所 ○ 汎用的な、あらゆるソースコードの読み方についても同様の知識 ● 前提知識 ○ なんらかのプログラミング経験がある ○ Gitが使える 2

Slide 3

Slide 3 text

Linuxカーネルソースの規模感 ● V6.3時点で > 3,000万行 ● バージョン間の変化: v6.2 -> v6.3(リリース間隔は約2か月) ○ コミット数: > 15,000 ○ 増加した行数: > 47,000 3

Slide 4

Slide 4 text

Linuxカーネルソースの規模感 ● V6.3時点で > 3,000万行 ● バージョン間の変化: v6.2 -> v6.3(リリース間隔は約2か月) ○ コミット数: > 15,000 ○ 増加した行数: > 47,000 ● 目的を定めずに「とりあえず読んでみるか」はかな り厳しい! 4

Slide 5

Slide 5 text

読むコツ ● 明確、かつ、小さめの目標を立てる ○ 「カーネルを完全に理解したい」 => つらい(3000万行) ○ 「この機能でこのオプションを使ったときの挙動を知りたい」 => それならなんとか(1000行) ● gitなどのツールを駆使して読まなければならないコード量を減らす ● 読むだけでなく実際に動かしてみる ● 本やWeb記事を読んで前提知識を適宜身に着ける(スライド末尾の付録参照) ○ OSカーネルの専門知識 ○ Linuxカーネルの独自用語 5

Slide 6

Slide 6 text

実例 ● きっかけ ○ 出版した書籍で言及していた /proc/sys/kernel/sched_latency_nsというファイルが存在しないと読 者に突っ込まれた ■ https://zenn.dev/satoru_takeuchi/articles/cec2160c6b1b13 ○ 実機検証はしたはずだが …なぜだ!? ● 問題のスコープ ○ 読者のカーネル(v5.15)でファイルがなくなっているのかを確認 ○ 本当になくなっていたのであれば、いつなくなったかの確認 6

Slide 7

Slide 7 text

まずやること ● v5.15のソースをチェックアウトして読む 7

Slide 8

Slide 8 text

まずやること ● V5.15のソースをチェックアウトして読む…のはめんどくさいので、まずは 実機で確認 ● 読まなくても動かせばわかることがいっぱいある! 8

Slide 9

Slide 9 text

実機検証 ● やること ○ 特定のカーネルでブートしたシステムにログインして /proc/sys/kernel/sched_latency_nsファイルが あるかどうか確認 ● 結果 ○ 自分の環境のカーネルバージョン (v5.4) ■ ファイルはあった ○ 読者のカーネルバージョン (v5.15) ■ ファイルはなかった 9

Slide 10

Slide 10 text

どこのバージョンで変化があったか確認 ● V5.4, v5.5, v5.6…と、カーネルバージョンを一個づつ変えて動作確認 10

Slide 11

Slide 11 text

どこのバージョンで変化があったか確認 ● V5.4, v5.5, v5.6…と、カーネルバージョンを一個づつ変えて動作確認…は、め んどくさそうなので以下のようなことをした 1. V5.4のソース上でsched_latency_nsをgrepで検索して、このファイ ルを作っている処理を見つける 2. V5.15のソース上で上記処理が存在していないことを確認 3. 上記処理がいつ無くなったかを、ソースコードのバイナリサーチ(後述) によって確認 11

Slide 12

Slide 12 text

ソースコードのバイナリサーチ 1. v5.4とv5.15の中間のv5.9をチェックアウトして、処理があることを確認 2. V5.9とv5.15の中間のv5.12をチェックアウトして、処理があることを確認 3. v5.12とv5.15の中間の…というのを繰り返す 4. 最終的にv5.13において処理が無くなったことを特定 12

Slide 13

Slide 13 text

大事なこと ● 実はソースをあんまり読んでいない ● 一見ソースを読まなければならないようなときも、読む前にかなりの絞り込みができ る ● 「どこで読み始めるか」という最適解は無い ○ 考えられる選択肢のうち「なんとなく一番たくさん楽できそう」なものから順番に試してみるのがヨシ ○ 「なんとなく一番楽できそう」なものを推測するのは経験を積むほどうまくなる ○ 最初から最善を求めると身動きできなくなるので、とにかく回数をこなすとよい 13

Slide 14

Slide 14 text

おわりに ● Linuxカーネルはものすごく大規模 ● まともに挑むと道に迷うだけ ● 目的を明確化した上で読むべき場所を減らしていく ● 読むための基礎知識をWebや書籍で適宜得る必要がある ● 経験がものをいう ● Happy Hacking! 14

Slide 15

Slide 15 text

参考書籍 ● 詳解Linuxカーネル ○ https://amzn.to/3IvCneV ○ 昔の本だが概念の理解には役立つ。実装の説明は流し読みかスルーでいい ● Linux Kernel Development 3rd edition ○ https://amzn.to/439tW0y ○ これまた古い本だが概念の理解に役立つ。詳解 Linuxカーネルよりだいぶ読みやすい ● Linuxのしくみ 増補改訂版 ○ https://amzn.to/45keroj ○ 概念の理解に役立つ。この中ではいちばんやさしい。ソースは出てこない ● Linux Kernel Programming ○ https://amzn.to/41USNnV ○ いまのところ一番新しい本。 11月に第二版が出るらしい 15

Slide 16

Slide 16 text

参考サイト ● Linux Kernel Newbies ○ https://kernelnewbies.org/ ○ カーネル関連用語解説や、どのバージョンでどんな機能が入ったかなどが書いている ● LWN.net ○ https://lwn.net/ ○ Linux Kernelのホットなトピックを扱うニュースサイト 16