vim で Linux カーネルソースを読むとき、何もしていないとソース上で登場する関数の定義や関数の参照先などを調べるのがとても面倒です(grep を使うなど)。今回はそういった面倒を減らしたいに人に向けた記事です。
1 やること
次のとおり、非常に簡単です。
必要なパッケージをインストール (Fedora の場合)
$ dnf install cscope
Linux カーネルソースのルートディレクトリへ移動1
$ cd <Linux カーネルソースのルートディレクトリ>
Linux カーネルソースの Makefile を利用して cscope の index を生成
$ make cscope
2 できること
上記をやっておくと、関数の定義などを確認するのが楽になります。
なお、以降の case では、次の条件を満たしている前提で進めます。
- カレントディレクトリが、Linux カーネルソースのルートディレクトリ(
$ make cscope
したディレクトリ)であること $ vim mm/oom_kill.c
でソースファイルを開いていること2- vim がノーマルモードになっていること
case1: 指定した関数の定義元へジャンプ
- 定義を確認したい関数の上にカーソルを合わせる
Ctrl + ]
or
- vim で
:cs f g <定義を確認したい関数名>
を実行
実行例1では check_panic_on_oom 関数内3で使用されている is_sysrq_oom 関数の定義を確認( Ctrl + ]
)しています。
なお、元の場所(check_panic_on_oom 関数)へ戻るには Ctrl + t
か Ctrl + o
を実行します。
case2: 指定した関数の参照先へジャンプ
- vim で
:cs f c <関数名>
を実行 - 確認したい参照先に対応する番号を指定 (呼び出し先が複数ある場合に限る)
実行例2では is_sysrq_oom 関数の参照先を確認しています。参照先が複数あったので 1
を指定し、確認しています。
case3: 指定した関数内で使用している関数の一覧を確認
- 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 押下)です。
以上です。ご参考までに。