Linux Kernel の勉強って何だ?
矢吹幸治(yabuki@netfort.gr.jp)
2017/09/23
Debian GNU/Linux 方面から来ました。 矢吹です。
KernelというGenericな話を私がするのは?
最初に質問は随時受け付けますが、時間の関係があるので、時間がかかりそうな質問は後にするか、明日Debian勉強会があるので、そこでても構いません。
- お仕事で、Linux Kernel の TCPアルゴリズムを触るお仕事をしたから。(話す資格はあるだろう)
- キーワードに、“Rasberry Pi”というものがあったから。(Rasbian)
- Linuxカーネルを勉強するにあたって、ソースコードだけでなく手元に動く環境を作るだろうから、その時にDebianまたはその派生が選ばれるように情報提供をしたかった。
- 組み込みでDebianや由来のツ-ルは使われている。
- システム・プログラミングという言葉を知っていますか
- システム・プログラミングしたことありますか
- バイナリアンって言葉知ってますか?
- あなたは、バイナリアンですか? またはバイナリアンになりたいですか?
- あなたは、Computer Scienceを学びましたか? (学校で? 独学で?)
続く
- Gitって知ってますか?
- Githubでなく生でGit使えますか?
- C言語を使ってプログラムを作って、gcc, llvmなどでコンバイルしたことありますか?
- gdbを使ったことありますか?
- どの位のサイズのソースコードを読んだ経験がありますか?
続く
- 具体的にKernelのどこに興味があるか特定できますか
- どれぐらい、自分の勉強に時間をかけていますか
- 英文読むときにこまった経験ありますか?
- Linux マシンを持とう。
- 非力な環境を振り回して、限界を知る。
- 死んだ情報 vs 生きた情報
- 書籍紹介
- ソースコードを読むには
- どうやって読む?
- 人は動かないプログラムに我慢できない
Debian
- Debianの紹介
- Kernelに関係するパッケージ
- 読むためのツール
- tool-chain
- Debian由来のツール
- カーネルをコンバイル
- ソースコードデバッグ
- qemu + gdb
Linuxなマシンを持とう。
私は毎日使っている。使っている時間が増えると、それなりにノウハウもたまる。
- 今から紹介するツールは、主にLinux上、もっと特定すると Debian系について念頭に置いている
- Linux kernel buildするでしょ?
- Buildしたら動かすよね?
- ソースコードレベルデバッグしたい? いくつか方法があるけど。
非力な環境を振り回して、限界を知る。
- 軽トラでドリフトが楽しい理由 - 限界値が低くて比較的安全にドリフトできる
- 非力な環境を飽和させて、限界の挙動を学習できる。
- 予測と実績を計測しやすい – Computer Science の知見がいる。
死んだ情報 vs 生きた情報
このタイトルは釣りです。今すぐ役立つ情報は歴史の変化で風化する。
- 変化 — Boot方式の変更 UEFI や systemd 場合によっては組み込み系も大変だ
- 抽象度の高い情報が役立つには時間がかかる。だから両方やれ。
- 古い環境があるうちにやっておこう。 時間との競争
- 書籍はどれぐらい役に立つか。理論と実践:手を動かさないとなにもわからない
書籍紹介
ほんとうは、いっばいある。でも、1つあげるなら、これかなと
下準備
- ソースコード展開
- どうやって追っかける? 2つの方法
- 頭の中だけで完結する?
ソースコードを読むためのツール
- GNU Global
- Source Code search engine: Milkode, Gonzuiとかもあったが
- Ctag
- git grep
などなど。
どうやって読む? 2つの方法
- 自分の興味が定まっているなら、そのエントリーポイントから、検索しまくって、時短で読む(下準備ができて、基礎ができている人向け)
- 「ひらメソッド」ボムアップで、ソースコードを読む。
相反しているように見えるが?
ひとの理解をそのまま飲み込むと、痛い目に会うことがある。自分で試して確認しよう。
どのぐらい頑張る?常に最新の状況を追えるか?
人は実行できないプログラムに我慢できない
- 机上でソースコードを読みつづける
- 動いているイメージが持てないので、飽きる。
- ソースコードを読むのを止めてしまう
では、どうするか?
- 仕事にする。
- ソースコードだけで、動くのがイメージてきるようになる
動かして、痕跡をたどりながら読む。
- printk
gdb
Debian の紹介
先ほどの問題への私なりの答えは、紹介のあとに。
kernelに関係するパッケージ
- linux-image
- linux-source
- linux-doc
- あとはモジュール
- blob — Debian してはソースコードがないものは入れたくない。が、ユーザーの利便性のために置いてある。
読むためのツール
- sphinxでドキュメントをビルド
- apt install global
- apt install exuberant-ctags
- apt install cscope
- milkodeは、パッケージになってないので、必要ならコンテナか生で、インストールしましょう。
Debianには、他にもソースコード読むのに役立つツ-ルがあるが紹介が追いついていない。apt-cache search コマンドなどで探してみよう。
- /boot/config-4.12.0-2-amd64 - カーネルの設定が置いてある。
- /boot/System.map-4.12.0-2-amd64 - シンボルが置いてある
- /boot/initrd.img-4.12.0-2-amd64 - 起動時に必要なファイルをcpioで固めてある
- /boot/vmlinuz-4.12.0-2-amd64 - カーネルイメージ
- grubもbootの下にある。
- クロスビルドしないなら、apt install build-essentialで最低限のビルド環境は整う
- gcc
- llvm
Debian 由来のツールや利点など
- debootstrap
- 整備された、ツール群と、開発環境を揃えることができる。
- Licenseの精査 これが自由につかっていい保証をしている。
カーネルをコンバイルする
- 8.10. カーネルのコンパイル
- 上記では情報が足りない場合は、apt install debian-kernel-handbook-ja を実行してから ブラウザに ///usr/share/doc/debian-kernel-handbook-ja/kernel-handbook.ja.html/index.html と入力するか、w3mなどを使うとよいでしょう。
ソースコードデバッグ
方法か洗練というか便利になってきているので、updateをしなくては。
- qemu-kvm (qemu-system-x86_64とか)に、gdbとの連携ができるようになっていた。
- KernelのKGDBは、別のマシンとシリアルやTCPで通信してGDBが使えるようになる
- 動かしているカーネルのと同じ(a.k.a 生成した)linux-sourceバッケージ
- 同上のlinux-image-amd64-dbg – amd64はアーキテクチャーによって異なる。
qemu + gdb
- アーキテクチャーを選べる - HostはAMD64, targetはarm
- man qemu-system で、-s オプションと、-gdbオプションを確認せよ。
- gdbに、デバッグシンボル、ソースコードの位置をセットする
- 動かす。
TCP/IPをComputer Scienceでやったひといますか?
Linux は、TCPのアルゴリズムを変更できる。
Renoとか。ただしこれをさわるとTCPの論文を読んで何を得て、何を失って、どういうときにネットワークが輻輳するのか。の比較検討をしてほしい。まずはバッファの量などから始まり、ネットワーク品質などを確認してからのほうがいい。
アルゴリズムについては、英語で論文がある。技術書は一般的なことしかカバーできないいうのがよくわかる。