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
会社員しながら本を書いてきた知見の共有
sat
PRO
3
740
デバイスにアクセスするデバイスファイル
sat
PRO
1
31
ファイルシステムのデータを ブロックデバイスへの操作で変更
sat
PRO
1
27
デバイスドライバ
sat
PRO
0
43
マルチスレッドの実現方法 ~カーネルスレッドとユーザスレッド~
sat
PRO
2
94
共有メモリ
sat
PRO
3
65
マルチスレッドプログラム
sat
PRO
3
54
Linuxのブートプロセス initramfs編
sat
PRO
2
73
Linuxのブートプロセス
sat
PRO
6
180
Other Decks in Technology
See All in Technology
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
110
新規プロダクト開発、AIでどう変わった? #デザインエンジニアMeetup
bengo4com
0
450
SFTPコンテナからファイルをダウンロードする
dip
0
180
産業機械をElixirで制御する
kikuyuta
0
170
AIエージェントの継続的改善のためオブザーバビリティ
pharma_x_tech
6
1.1k
Tenstorrent 開発者プログラム
tenstorrent_japan
0
310
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
6.4k
「どこにある?」の解決。生成AI(RAG)で効率化するガバメントクラウド運用
toru_kubota
2
390
Grafana MCP serverでなんかし隊 / Try Grafana MCP server
kohbis
0
340
TODAY 看世界(?) 是我們在看扣啦!
line_developers_tw
PRO
0
160
Digitization部 紹介資料
sansan33
PRO
1
4.2k
「規約、知識、オペレーション」から考える中規模以上の開発組織のCursorルールの 考え方・育て方 / Cursor Rules for Coding Styles, Domain Knowledges and Operations
yuitosato
6
1.6k
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1031
460k
Writing Fast Ruby
sferik
628
61k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Done Done
chrislema
184
16k
Embracing the Ebb and Flow
colly
86
4.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
GraphQLとの向き合い方2022年版
quramy
46
14k
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
Building Applications with DynamoDB
mza
95
6.4k
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