以下イベントのセッションスライドです。 https://techfeed.io/events/techfeed-experts-night-19
カーネルコードの歩き方May. 24, 2023Satoru Takeuchitwitter: satoru_takeuchi1
View Slide
はじめに● 著者○ 社会人一年生から15年くらいカーネル開発 /サポートをやってきた○ 今も必要に応じてカーネルソースを見ている● 本LTで学べること○ Linuxのカーネルソースの読み方についての勘所○ 汎用的な、あらゆるソースコードの読み方についても同様の知識● 前提知識○ なんらかのプログラミング経験がある○ Gitが使える2
Linuxカーネルソースの規模感● V6.3時点で > 3,000万行● バージョン間の変化: v6.2 -> v6.3(リリース間隔は約2か月)○ コミット数: > 15,000○ 増加した行数: > 47,0003
Linuxカーネルソースの規模感● V6.3時点で > 3,000万行● バージョン間の変化: v6.2 -> v6.3(リリース間隔は約2か月)○ コミット数: > 15,000○ 増加した行数: > 47,000● 目的を定めずに「とりあえず読んでみるか」はかなり厳しい!4
読むコツ● 明確、かつ、小さめの目標を立てる○ 「カーネルを完全に理解したい」 => つらい(3000万行)○ 「この機能でこのオプションを使ったときの挙動を知りたい」 => それならなんとか(1000行)● gitなどのツールを駆使して読まなければならないコード量を減らす● 読むだけでなく実際に動かしてみる● 本やWeb記事を読んで前提知識を適宜身に着ける(スライド末尾の付録参照)○ OSカーネルの専門知識○ Linuxカーネルの独自用語5
実例● きっかけ○ 出版した書籍で言及していた /proc/sys/kernel/sched_latency_nsというファイルが存在しないと読者に突っ込まれた■ https://zenn.dev/satoru_takeuchi/articles/cec2160c6b1b13○ 実機検証はしたはずだが …なぜだ!?● 問題のスコープ○ 読者のカーネル(v5.15)でファイルがなくなっているのかを確認○ 本当になくなっていたのであれば、いつなくなったかの確認6
まずやること● v5.15のソースをチェックアウトして読む7
まずやること● V5.15のソースをチェックアウトして読む…のはめんどくさいので、まずは実機で確認● 読まなくても動かせばわかることがいっぱいある!8
実機検証● やること○ 特定のカーネルでブートしたシステムにログインして /proc/sys/kernel/sched_latency_nsファイルがあるかどうか確認● 結果○ 自分の環境のカーネルバージョン (v5.4)■ ファイルはあった○ 読者のカーネルバージョン (v5.15)■ ファイルはなかった9
どこのバージョンで変化があったか確認● V5.4, v5.5, v5.6…と、カーネルバージョンを一個づつ変えて動作確認10
どこのバージョンで変化があったか確認● V5.4, v5.5, v5.6…と、カーネルバージョンを一個づつ変えて動作確認…は、めんどくさそうなので以下のようなことをした1. V5.4のソース上でsched_latency_nsをgrepで検索して、このファイルを作っている処理を見つける2. V5.15のソース上で上記処理が存在していないことを確認3. 上記処理がいつ無くなったかを、ソースコードのバイナリサーチ(後述)によって確認11
ソースコードのバイナリサーチ1. v5.4とv5.15の中間のv5.9をチェックアウトして、処理があることを確認2. V5.9とv5.15の中間のv5.12をチェックアウトして、処理があることを確認3. v5.12とv5.15の中間の…というのを繰り返す4. 最終的にv5.13において処理が無くなったことを特定12
大事なこと● 実はソースをあんまり読んでいない● 一見ソースを読まなければならないようなときも、読む前にかなりの絞り込みができる● 「どこで読み始めるか」という最適解は無い○ 考えられる選択肢のうち「なんとなく一番たくさん楽できそう」なものから順番に試してみるのがヨシ○ 「なんとなく一番楽できそう」なものを推測するのは経験を積むほどうまくなる○ 最初から最善を求めると身動きできなくなるので、とにかく回数をこなすとよい13
おわりに● Linuxカーネルはものすごく大規模● まともに挑むと道に迷うだけ● 目的を明確化した上で読むべき場所を減らしていく● 読むための基礎知識をWebや書籍で適宜得る必要がある● 経験がものをいう● Happy Hacking!14
参考書籍● 詳解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
参考サイト● Linux Kernel Newbies○ https://kernelnewbies.org/○ カーネル関連用語解説や、どのバージョンでどんな機能が入ったかなどが書いている● LWN.net○ https://lwn.net/○ Linux Kernelのホットなトピックを扱うニュースサイト16