Upgrade to Pro — share decks privately, control downloads, hide ads and more …

カーネルコードの歩き方

 カーネルコードの歩き方

以下イベントのセッションスライドです。
https://techfeed.io/events/techfeed-experts-night-19

Satoru Takeuchi
PRO

May 24, 2023
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. 大事なこと
    ● 実はソースをあんまり読んでいない
    ● 一見ソースを読まなければならないようなときも、読む前にかなりの絞り込みができ

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

    View Slide

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

    View Slide

  15. 参考書籍
    ● 詳解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

    View Slide

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

    View Slide