Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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