Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vim で Linux カーネルソースを読む効率を上げるためにやっておくこと

$
0
0

vim で Linux カーネルソースを読むとき、何もしていないとソース上で登場する関数の定義や関数の参照先などを調べるのがとても面倒です(grep を使うなど)。今回はそういった面倒を減らしたいに人に向けた記事です。

1 やること

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

  1. 必要なパッケージをインストール (Fedora の場合)
    $ dnf install cscope

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

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

2 できること

上記をやっておくと、関数の定義などを確認するのが楽になります。

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

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

case1: 指定した関数の定義元へジャンプ

  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: ctags.gif

case2: 指定した関数の参照先へジャンプ

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

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

実行例2: cs_f_c.gif

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

  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_d.png

3 :cs f <クエリパターン><キーワード>について

先ほどから登場している :cs f <c、d などのクエリパターン> <関数名などのキーワード>というのは cscopeというツールによるもので、<クエリパターン> を変更することで、他にも色々とできます。クエリパターンは 実行例4のように :cs helpと入力することで確認できます。find : Query for a pattern の部分です。

ちなみに、:cs fというのは :cscope findの省略形です。

実行例4: cs_help.png

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 押下)です。

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


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

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

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>