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のどこに興味があるか特定できますか
  • どれぐらい、自分の勉強に時間をかけていますか
  • 英文読むときにこまった経験ありますか?

今日のお品書き

  1. Linux マシンを持とう。
  2. 非力な環境を振り回して、限界を知る。
  3. 死んだ情報 vs 生きた情報
  4. 書籍紹介
  5. ソースコードを読むには
  6. どうやって読む?
  7. 人は動かないプログラムに我慢できない

Debian

  1. Debianの紹介
  2. Kernelに関係するパッケージ
  3. 読むためのツール
  4. tool-chain
  5. Debian由来のツール
  6. カーネルをコンバイル
  7. ソースコードデバッグ
  8. qemu + gdb

Linux TCP module

Linuxなマシンを持とう。

私は毎日使っている。使っている時間が増えると、それなりにノウハウもたまる。

  • 今から紹介するツールは、主にLinux上、もっと特定すると Debian系について念頭に置いている
  • Linux kernel buildするでしょ?
  • Buildしたら動かすよね?
  • ソースコードレベルデバッグしたい? いくつか方法があるけど。

非力な環境を振り回して、限界を知る。

  • 軽トラでドリフトが楽しい理由 - 限界値が低くて比較的安全にドリフトできる
  • 非力な環境を飽和させて、限界の挙動を学習できる。
  • 予測と実績を計測しやすい – Computer Science の知見がいる。

死んだ情報 vs 生きた情報

このタイトルは釣りです。今すぐ役立つ情報は歴史の変化で風化する。

  • 変化 — Boot方式の変更 UEFI や systemd 場合によっては組み込み系も大変だ
  • 抽象度の高い情報が役立つには時間がかかる。だから両方やれ。
  • 古い環境があるうちにやっておこう。 時間との競争
  • 書籍はどれぐらい役に立つか。理論と実践:手を動かさないとなにもわからない

書籍紹介

ほんとうは、いっばいある。でも、1つあげるなら、これかなと

  • Code Reading 毎日コミュニケーションズ - C言語を使って大規模なプログラムを読んだことないなら

  • Linuxのブートブロセスをみる ASCII - これで自分になにが足りないのかを知る。

下準備

  • ソースコード展開
  • どうやって追っかける? 2つの方法
  • 頭の中だけで完結する?

ソースコードを読むためのツール

  • GNU Global
  • Source Code search engine: Milkode, Gonzuiとかもあったが
  • Ctag
  • git grep

などなど。

どうやって読む? 2つの方法

  1. 自分の興味が定まっているなら、そのエントリーポイントから、検索しまくって、時短で読む(下準備ができて、基礎ができている人向け)
  2. 「ひらメソッド」ボムアップで、ソースコードを読む。

相反しているように見えるが?

ひとの理解をそのまま飲み込むと、痛い目に会うことがある。自分で試して確認しよう。

どのぐらい頑張る?常に最新の状況を追えるか?

人は実行できないプログラムに我慢できない

  1. 机上でソースコードを読みつづける
  2. 動いているイメージが持てないので、飽きる。
  3. ソースコードを読むのを止めてしまう

では、どうするか?

  • 仕事にする。
  • ソースコードだけで、動くのがイメージてきるようになる
  • 動かして、痕跡をたどりながら読む。

  • printk
  • gdb

Debian

Debian の紹介

先ほどの問題への私なりの答えは、紹介のあとに。

  • Debian – ユニバーサルオペレーティングシステム

  • 非営利の団体が、汎用のOSを作っている。企業ではないので、買収などではなくならない。
  • Ubuntu, Rasbian を含む多くの派生ディストリビューションを持っている。— それはなぜか?
  • もちろん組み込みのベースとしても使われている

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の下にある。

tool-chain

  • クロスビルドしないなら、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に、デバッグシンボル、ソースコードの位置をセットする
  • 動かす。

Linux TCP module

TCP/IPをComputer Scienceでやったひといますか?

Linux は、TCPのアルゴリズムを変更できる。

Renoとか。ただしこれをさわるとTCPの論文を読んで何を得て、何を失って、どういうときにネットワークが輻輳するのか。の比較検討をしてほしい。まずはバッファの量などから始まり、ネットワーク品質などを確認してからのほうがいい。

アルゴリズムについては、英語で論文がある。技術書は一般的なことしかカバーできないいうのがよくわかる。

最後に