はじめに
BitVisor のような低レイヤのコードを含むシステムソフトウェアのソースコードを読み解いて理解するのは中々骨が折れるものです.
しかしながら,このようなソフトウェアをベースとした研究開発を行う上ではコードを読むことは避けては通れないと思います.
そこで,今回は僕が BitVisor のソースコードを読むときに使っているツールやtips をご紹介します.
CLI コマンド
find-grep
王道だと思いますが,find コマンドと grep コマンドの組み合わせです.
カレントディレクトリ以下の *.c* と
*.h` ファイルから特定のキーワードを探すときは以下のような感じ.
find . -name '*.[ch]' | xargs grep 'hoge'
カレントディレクトリ以下のテキストファイルから特定のキーワードを探すときは以下のような感じ.
find . -type f | xargs grep -I 'hoge'
オプションの解説
-
find . -type f
でファイルのパスを全て返す -
grep
の-I
オプションはバイナリを検索対象としないというもの
検索結果が多いし色付きで結果が見たいというときは,以下のようにすると色付きで
less
コマンドで眺められます.
find . -type f | xargs grep I --color=always 'hoge' | less -R
オプションの解説
-
grep
の--color=always
はパイプで出力を渡すときでも色情報を付けるオプショ
ン -
less
の-R
は色情報を受け取って色を付けて表示するオプション
*tags ソフトウェア
僕はセットアップが面倒であまり使っていませんが,ctags, etags, gtags, rtags な
どのソフトウェアと専用のCLI コマンドもしくはエディタを組み合わせることでタグジャ
ンプ(変数が使われている部分から変数の定義にジャンプする etc.) ができます.
BitVisor に対して rtags を使ってみた記事はこちら.
Web UI
Web ブラウザでコードを読めればタブレットやスマフォですきま時間に BitVisor のソー
スコードが読めて便利です.
GNU Global
あまり知られていないのではないかと思いますが,実は上記 URL にあるページでソースコードを読めます.
しかもシンボルがリンクになっていて,そこからをシンボルの定義 <--> 参照を行き来できます.
これは,GNU Global (gtags と htags コマンド)で生成されたページになっています.
おそらくですが,常に最新のコードが見れるようになっていると思います.
Bitbucket/Github
Bitbucket や Github の Web UI からもソースコードが読めます.
こちらはシンボルのジャンプなどはできませんが,シンタックスハイライトが効いているのでそれなりに読めると思います.
- Bitbucket: https://bitbucket.org/bitvisor/bitvisor/src/default/
- Github (非公式ミラー?) https://github.com/matsu/bitvisor
スマフォなどで Bitbucket の WebUI でソースコードを見る場合は,Annotate ビュー が見やすい.
(Edit
ボタンの右にある ・・・
をタップして Annotate
を選択すると見れる画面です)
Word で読む
この記事で一番書きたかったものです.
皆さん書類を作るときなどに MS Word などを使うかもしれませんが,それを使ってコードを読むというものです (MS Word でなくても Libre Office などでも大丈夫です)
僕は腰を据えて複雑なコードを理解したい時にはこの方法でコードを読みます.
どうやるかというと,
- エディタや Web UI から読みたいコードを Word にコピペする.(大体は関数単位でコピペしています)
- 読みたい関数の仮引数,ローカル変数,グローバル変数にそれぞれ別の色を付ける.たまに戻り値には別の色を付ける.
- コメントなどを付けながら読み進める
という感じです.
この方法の利点はエディタと違って背景色を変える,線を引くなどもできてメモ書きの自由度が高い点です.
感覚としては,コードを紙に印刷してペンで色々メモ書きしながら読み進めるのに似ています.
それに加えて検索もできますし,読んだメモはそのまま電子データとして残せるのでよいかと思います.
最近だと iPad や Surface などを使ってペンを使いながらやるともっとやりやすいかもしれません.
また,処理の中で混在する仮引数,戻り値,グローバル変数,ローカル変数を視覚的に区別しやすくすると,コードの見通しがかなりよくなります.
他のソフトウェアのコードを参考にする
デバイスドライバの処理や vt-x の機能の使い方などを知りたい時には他のソフトウェアのコードを読んで理解することも有用です.
僕が主に参考にするのは,FreeBSD や NetBSD です.
理解するという観点では Linux でもいいのですが,GPL が気になる立場の人は BSD ライセンスの FreeBSD や NetBSD を読むとよいかと思います.
手軽に上記のコードを読みたい場合は,http://fxr.watson.org/ が便利です.
例えば FreeBSD 12 STABLE だと
- VMM のコード は
sys/amd64/vmm/
(http://fxr.watson.org/fxr/source/amd64/vmm/?v=FREEBSD-12-STABLE) - Realtek は
sys/dev/re/if_re.c
は (http://fxr.watson.org/fxr/source/dev/re/if_re.c?v=FREEBSD-12-STABLE)
にコードがあります.
おわりに
BitVisor のソースコードを読むためのツールや tips をご紹介しました.
GNU Global で生成された Web ページや Word で読む方法は個人的なおススメです.
他にいいツールやテクニックがあるよ,という方はコメントくださるとありがたいです 🙇♂️