Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カーネルコードの歩き方
Search
Satoru Takeuchi
PRO
May 24, 2023
Technology
4
4k
カーネルコードの歩き方
以下イベントのセッションスライドです。
https://techfeed.io/events/techfeed-experts-night-19
Satoru Takeuchi
PRO
May 24, 2023
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
Rook: Intro and Deep Dive With Ceph
sat
PRO
1
110
会社員しながら本を書いてきた知見の共有
sat
PRO
3
790
デバイスにアクセスするデバイスファイル
sat
PRO
1
37
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
31
デバイスドライバ
sat
PRO
0
49
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
sat
PRO
2
120
共有メモリ
sat
PRO
3
70
マルチスレッドプログラム
sat
PRO
3
58
Linuxのブートプロセス initramfs編
sat
PRO
2
87
Other Decks in Technology
See All in Technology
Tech-Verse 2025 Global CTO Session
lycorptech_jp
PRO
0
1.7k
生成AI時代の開発組織・技術・プロセス 〜 ログラスの挑戦と考察 〜
itohiro73
1
440
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
3
960
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
810
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
27k
SaaS型なのに自由度の高い本格CMSでサイト構築と運用のコスパ&タイパUP! MovableType.net の便利機能とユーザー事例のご紹介
masakah
0
100
ドメイン特化なCLIPモデルとデータセットの紹介
tattaka
2
580
敢えて生成AIを使わないマネジメント業務
kzkmaeda
2
410
United Airlines Customer Service– Call 1-833-341-3142 Now!
airhelp
0
160
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
7
5.2k
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
4
240
Beyond Kaniko: Navigating Unprivileged Container Image Creation
f30
0
130
Featured
See All Featured
Thoughts on Productivity
jonyablonski
69
4.7k
A Modern Web Designer's Workflow
chriscoyier
694
190k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Music & Morning Musume
bryan
46
6.6k
Embracing the Ebb and Flow
colly
86
4.7k
The Pragmatic Product Professional
lauravandoore
35
6.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Navigating Team Friction
lara
187
15k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Practical Orchestrator
shlominoach
189
11k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Transcript
カーネルコードの歩き方 May. 24, 2023 Satoru Takeuchi twitter: satoru_takeuchi 1
はじめに • 著者 ◦ 社会人一年生から15年くらいカーネル開発 /サポートをやってきた ◦ 今も必要に応じてカーネルソースを見ている • 本LTで学べること
◦ Linuxのカーネルソースの読み方についての勘所 ◦ 汎用的な、あらゆるソースコードの読み方についても同様の知識 • 前提知識 ◦ なんらかのプログラミング経験がある ◦ Gitが使える 2
Linuxカーネルソースの規模感 • V6.3時点で > 3,000万行 • バージョン間の変化: v6.2 -> v6.3(リリース間隔は約2か月)
◦ コミット数: > 15,000 ◦ 増加した行数: > 47,000 3
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