do_initcall関数はドライバなどの初期化関数を呼び出します。
initcall_debug
という起動パラメータを与えると、これらの初期化関数呼び出しの情報をdmesgに出力されるようになります。
この呼び出しの情報をbootgrapghというスクリプトを用いてグラフ化します。
準備
対象となるカーネルにおいてCONFIG_KALLSYMS
とCONFIG_PRINTK_TIME
が有効になっている必要があります。
初期化情報の取得
initcall_debug
を起動パラメータに与えて起動します。
起動完了後にdmesgを確認すると以下のように初期化関数(initcall)の情報が出力されているはずです。
[ 0.003582] initcall init_static_idmap+0x0/0xe0 returned 0 after 0 usecs
[ 0.003610] calling spawn_ksoftirqd+0x0/0x1c @ 1
[ 0.003814] initcall spawn_ksoftirqd+0x0/0x1c returned 0 after 0 usecs
[ 0.003844] calling init_workqueues+0x0/0x270 @ 1
[ 0.004475] initcall init_workqueues+0x0/0x270 returned 0 after 0 usecs
[ 0.004506] calling check_cpu_stall_init+0x0/0x20 @ 1
[ 0.004530] initcall check_cpu_stall_init+0x0/0x20 returned 0 after 0 usecs
[ 0.004556] calling rcu_scheduler_really_started+0x0/0x18 @ 1
[ 0.004578] initcall rcu_scheduler_really_started+0x0/0x18 returned 0 after 0 usecs
グラフの作成
グラフの生成はカーネルのソースに含まれるscripts/bootgraph.plを使用します。
対象マシン上にbootgraph.plが無い場合はdmesgの内容を保存します。
$ dmesg > boot.log
bootgraph.plが有る環境にて以下のようにsvg画像を出力します。
$ scripts/bootgraph.pl boot.log > boot.svg
対象マシン上にbootgraph.plが有る場合は以下のようにワンライナーでOKです。
$ dmesg | scripts/bootgraph.pl > boot.svg
作成されたグラフ
画像の向きは変えました。
※処理時間の短いものは文字が潰れていますが、svg画像ではちゃんと見れます。