% Linux Kernel の勉強って何だ? % 矢吹幸治(yabuki@netfort.gr.jp) % 2017/09/23
最初に質問は随時受け付けますが、時間の関係があるので、時間がかかりそうな質問は後にするか、明日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 TCP module
私は毎日使っている。使っている時間が増えると、それなりにノウハウもたまる。
- 今から紹介するツールは、主にLinux上、もっと特定すると Debian系について念頭に置いている
- Linux kernel buildするでしょ?
- Buildしたら動かすよね?
- ソースコードレベルデバッグしたい? いくつか方法があるけど。
- 軽トラでドリフトが楽しい理由 - 限界値が低くて比較的安全にドリフトできる
- 非力な環境を飽和させて、限界の挙動を学習できる。
- 予測と実績を計測しやすい -- Computer Science の知見がいる。
このタイトルは釣りです。今すぐ役立つ情報は歴史の変化で風化する。
- 変化 --- Boot方式の変更 UEFI や systemd 場合によっては組み込み系も大変だ
- 抽象度の高い情報が役立つには時間がかかる。だから両方やれ。
- 古い環境があるうちにやっておこう。 時間との競争
- 書籍はどれぐらい役に立つか。理論と実践:手を動かさないとなにもわからない
ほんとうは、いっばいある。でも、1つあげるなら、これかなと
-
Code Reading 毎日コミュニケーションズ - C言語を使って大規模なプログラムを読んだことないなら
-
Linuxのブートブロセスをみる ASCII - これで自分になにが足りないのかを知る。
- ソースコード展開
- どうやって追っかける? 2つの方法
- 頭の中だけで完結する?
- GNU Global
- Source Code search engine: Milkode, Gonzuiとかもあったが
- Ctag
- git grep
などなど。
- 自分の興味が定まっているなら、そのエントリーポイントから、検索しまくって、時短で読む(下準備ができて、基礎ができている人向け)
- 「ひらメソッド」ボムアップで、ソースコードを読む。
相反しているように見えるが?
ひとの理解をそのまま飲み込むと、痛い目に会うことがある。自分で試して確認しよう。
どのぐらい頑張る?常に最新の状況を追えるか?
- 机上でソースコードを読みつづける
- 動いているイメージが持てないので、飽きる。
- ソースコードを読むのを止めてしまう
では、どうするか?
-
仕事にする。
-
ソースコードだけで、動くのがイメージてきるようになる
-
動かして、痕跡をたどりながら読む。
-
printk
-
gdb
先ほどの問題への私なりの答えは、紹介のあとに。
-
非営利の団体が、汎用のOSを作っている。企業ではないので、買収などではなくならない。
-
Ubuntu, Rasbian を含む多くの派生ディストリビューションを持っている。--- それはなぜか?
-
もちろん組み込みのベースとしても使われている
- 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
- 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はアーキテクチャーによって異なる。
- アーキテクチャーを選べる - HostはAMD64, targetはarm
- man qemu-system で、-s オプションと、-gdbオプションを確認せよ。
- gdbに、デバッグシンボル、ソースコードの位置をセットする
- 動かす。
TCP/IPをComputer Scienceでやったひといますか?
Renoとか。ただしこれをさわるとTCPの論文を読んで何を得て、何を失って、どういうときにネットワークが輻輳するのか。の比較検討をしてほしい。まずはバッファの量などから始まり、ネットワーク品質などを確認してからのほうがいい。
アルゴリズムについては、英語で論文がある。技術書は一般的なことしかカバーできないいうのがよくわかる。
- ライセンス: このスライドは、GPLv2を適用します。
- 公開場所 Linux Kernel の勉強って何だ?
- 対象ファイル html-slides/20170923kernel.md at master · yabuki/html-slides Typoとか見つけたら、教えてください。