Vim で Linux カーネルソースを快適に読むための設定


■ はじめに

vim で Linux カーネルソースを読むとき、何もしていないとソース上で登場する関数の定義や関数の呼び出し元などを調べるのがとても面倒です(grep を使うなど)。

本稿ではそういった面倒を減らすためにやっておきたいことを書いています。やっておくことコードリーディングが快適になるかもしれません。

■ 設定

次のとおり、非常に簡単です。

  1. cscope をインストール (Fedora の場合)
    $ dnf install cscope

  2. Linux カーネルソースのルートディレクトリへ移動1
    $ cd <Linux カーネルソースのルートディレクトリ>

  3. Linux カーネルソースの Makefile を利用して cscope の index を生成
    $ make cscope

■ できるようになること

上記をやっておくと、関数の定義元や関数の呼び出し元へジャンプできるようになるなど、コードリーディングが非常に快適になります。

なお、以降では、次の条件を満たしている前提で進めます。

  • カレントディレクトリが、Linux カーネルソースのルートディレクトリ($ make cscope したディレクトリ)であること
  • $ vim mm/oom_kill.c でソースファイルを開いていること2
  • vim がノーマルモードになっていること

1. 指定した関数の定義元へジャンプ

  1. 定義を確認したい関数の上にカーソルを合わせる
  2. Ctrl + ]

or

  1. vim で :cs f g <定義を確認したい関数名> を実行

実行例1 では check_panic_on_oom 関数内3で使用されている is_sysrq_oom 関数の定義を確認(Ctrl + ])しています。

なお、元の場所(check_panic_on_oom 関数)へ戻るには Ctrl + tCtrl + o を実行します。

実行例1:

2. 指定した関数の呼び出し元へジャンプ

  1. vim で :cs f c <関数名> を実行
  2. 確認したい箇所に対応する番号を指定 (呼び出し元が複数ある場合に限る)

実行例2 では is_sysrq_oom 関数の呼び出し元を確認しています。呼び出し元が複数あったので 1 を指定し、確認しています。

実行例2:

3. 指定した関数内で使用している関数の一覧を確認

  1. 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 のキー割り当てを設定することをおススメします。例えば、次のような感じです。

.vimrc
" 任意の関数名にカーソルを当てた状態で 「Shift + c」 すると、その関数の呼び出し元を確認できる。
nnoremap <S-c> :cs f c <cword><CR>

" 任意の関数名にカーソルを当てた状態で 「Shift + d」 すると、その関数内で使用している関数の一覧を確認できる。
nnoremap <S-d> :cs f d <cword><CR>

すこし解説しますと、

  • nnoremap はノーマルモードでのキー割り当て(再割り当てなし)を定義するコマンドです。

  • <S-c>Shift + c を押下した時という意味です。

  • :cs f c <cword><c><S-c> をした時に実行されるコマンドです。

    • <cword> は現在のカーソル位置にある単語に置換されます。
    • <CR> はキャリッジリターン(Enter 押下)です。

以上です。ご参考までに。


  1. カーネルソースを入手していない方はこちらの記事を参考に入手してください。 

  2. 以降での説明を楽にするために便宜上 mm/oom_kill.c を開いています。深い意味はありません。 

  3. check_panic_oom 関数は mm/oom_kill.c ファイルに含まれています(v4.19 時点)。