vim で Linux カーネルソースを読むとき、何もしていないとソース上で登場する関数の定義や関数の呼び出し元などを調べるのがとても面倒です(grep を使うなど)。
本稿ではそういった面倒を減らすためにやっておきたいことを書いています。やっておくことコードリーディングが快適になるかもしれません。
1 やっておくこと
次のとおり、非常に簡単です。
- 必要なパッケージをインストール (Fedora の場合)
$ dnf install cscope
Linux カーネルソースのルートディレクトリへ移動1
$ cd <Linux カーネルソースのルートディレクトリ>
Linux カーネルソースの Makefile を利用して cscope の index を生成
$ make cscope
2 できるようになること
上記をやっておくと、関数の定義元や関数の呼び出し元へジャンプできるようになるなど、コードリーディングが非常に快適になります。
なお、以降では、次の条件を満たしている前提で進めます。
- カレントディレクトリが、Linux カーネルソースのルートディレクトリ(
$ make cscope
したディレクトリ)であること $ vim mm/oom_kill.c
でソースファイルを開いていること2- vim がノーマルモードになっていること
2-1 指定した関数の定義元へジャンプ
- 定義を確認したい関数の上にカーソルを合わせる
- Ctrl + ]
or
- vim で
:cs f g <定義を確認したい関数名>
を実行
実行例1では check_panic_on_oom 関数内3で使用されている is_sysrq_oom 関数の定義を確認(Ctrl + ])しています。
なお、元の場所(check_panic_on_oom 関数)へ戻るには Ctrl + tか Ctrl + oを実行します。
2-2 指定した関数の呼び出し元へジャンプ
- vim で
:cs f c <関数名>
を実行 - 確認したい箇所に対応する番号を指定 (呼び出し元が複数ある場合に限る)
実行例2では is_sysrq_oom 関数の呼び出し元を確認しています。呼び出し元が複数あったので 1
を指定し、確認しています。
2-3 指定した関数内で使用している関数の一覧を確認
- vim で
:cs f d <関数名>
を実行
実行例3では :cs f d check_panic_on_oom
を実行し、check_panic_on_oom 関数内で使用している関数の一覧を確認しています。4つの関数(likely、is_sysrq_oom、dump_header、panic)を使用していることが確認できます。番号を指定することでその箇所へジャンプもできます。
3 :cs f <クエリパターン><キーワード>について
先ほどから登場している :cs f <c、d などのクエリパターン> <関数名などのキーワード>
というのは cscopeというツールによるもので、<クエリパターン> を変更することで、他にも色々とできます。クエリパターンは 実行例4のように :cs help
と入力することで確認できます。find : Query for a pattern 以下の部分です。
ちなみに、:cs f
というのは :cscope find
の省略形です。
4 より快適にするには
正直、毎回 :cs f c
のように入力するのはメンドクサイと思います。より快適にするには vim のキー割り当てを設定することをおススメします。例えば、次のような感じです。
" 任意の関数名にカーソルを当てた状態で 「Shift + c」 すると、その関数の呼び出し元を確認できる。
nnoremap <S-c>:csfc<cword><CR>" 任意の関数名にカーソルを当てた状態で 「Shift + d」 すると、その関数内で使用している関数の一覧を確認できる。
nnoremap <S-d>:csfd<cword><CR>
すこし解説しますと、
nnoremap
はノーマルモードでのキー割り当て(再割り当てなし)を定義するコマンドです。<S-c>
はShift + c
を押下した時という意味です。:cs f c <cword><c>
は<S-c>
をした時に実行されるコマンドです。<cword>
は現在のカーソル位置にある単語に置換されます。<CR>
はキャリッジリターン(Enter 押下)です。
以上です。ご参考までに。