kernel 内で使用されている関数をEmacsなどのプログラミング環境、もしくはシェルから効率よく調べる手順を教えてください。
すべての関数は無理だと思ってますので、使用頻度の高い関数(printk()など)がカバーされていればよいです。
以下これまで自分で調べた範囲での知識を挙げておきます。これらに当てはまらない方法であっても、効率的、便利な方法があれば教えてください。
・ kernel関数用のmanpageは、suseでは存在してるがUbuntuでは見つけられませんでした。
・ linux-doc は見てみましたが、探している関数名から説明を見つけるのがスムーズにできないため、あきらめました。
・ kernelソースコードをgrepで検索するのは時間がかかってしまう上、説明文もあった方がうれしい。grepの仕方にもコツがあるのでしょうか?
・ GNU Global の gtags も利用してみましたが、インデックス作成に時間がかかるのはともかく、Emacsでタグジャンプするのにも結構時間(2分とか)がかかっており、もっと効率がよい方法を探しています。(改善方法があればおしえてください。)
kernel関数用のmanについては分かりません。
というか自分は見たことがないです。
自分はVim使いなのでctagsを利用していますので参考までに。
makeでタグファイルを作成できます。
$ time make tags MAKE tags real 0m43.947s user 0m20.057s sys 0m2.472s
タグファイルを作成さえすれば一瞬で関数ジャンプが出来ます。
Emacsならば以下のコマンドでタグファイルを作成できるはずです。
make TAGS
ドライバの情報は以下のサイトで。英語ばかりですけど。
自分は以下のサイトと、本も購入済みです。
Linux Device Drivers, 2nd Edition(英語) 日本語版の本有り
Linux Device Drivers, Third Edition(英語) 日本語版の本有り
The Linux Kernel Module Programming Guide(英語)
関数の説明は関数の頭に説明があるかもしれません。
あとはひらメソッドをみれば結構情報があります。
とりあえずのコツはどの機能がどのディレクトリにあるかを覚えることです。
例えばipc/はIPC関係のソースがありますし、fs/はファイルシステム系があります。
また関数名もヒントになります。
システムコールはsys_*()という関数名になっているはずです。
open(2)であればsys_open()という関数名でfs/open.cにあります。
あとは頑張るのみかな。
kernel関数用のmanについては分かりません。
というか自分は見たことがないです。
自分はVim使いなのでctagsを利用していますので参考までに。
makeでタグファイルを作成できます。
$ time make tags MAKE tags real 0m43.947s user 0m20.057s sys 0m2.472s
タグファイルを作成さえすれば一瞬で関数ジャンプが出来ます。
Emacsならば以下のコマンドでタグファイルを作成できるはずです。
make TAGS
ドライバの情報は以下のサイトで。英語ばかりですけど。
自分は以下のサイトと、本も購入済みです。
Linux Device Drivers, 2nd Edition(英語) 日本語版の本有り
Linux Device Drivers, Third Edition(英語) 日本語版の本有り
The Linux Kernel Module Programming Guide(英語)
関数の説明は関数の頭に説明があるかもしれません。
あとはひらメソッドをみれば結構情報があります。
とりあえずのコツはどの機能がどのディレクトリにあるかを覚えることです。
例えばipc/はIPC関係のソースがありますし、fs/はファイルシステム系があります。
また関数名もヒントになります。
システムコールはsys_*()という関数名になっているはずです。
open(2)であればsys_open()という関数名でfs/open.cにあります。
あとは頑張るのみかな。
さっそくの回答ありがとうございます。
ctagsについては質問文で書いたgtagsと同様なものと理解しているのですが、kernel程度の規模のソースコードであっても実用レベルの反応速度で使用できますか?(ここの部分再度回答いただきたいです。)
Linuxデバイスドライバの本はすでに持っていますが、「The Linux Kernel Module Programming Guide」は知りませんでした。良さそうなサイトですね。ありがとうございます。
ちなみにsuseには存在しているようです、と書いたmanpageは以下URLに存在していました。
http://72.14.235.104/search?q=cache:7EIk-63SmusJ:rpmfind.net/lin...
「頑張る」の方向が見えるところまでまずはたどり着きたいと思っています。
>ctagsについては質問文で書いたgtagsと同様なものと理解しているのですが、kernel程度の規模のソースコードであっても実用レベルの反応速度で使用できますか?(ここの部分再度回答いただきたいです。)
gtagsはctagsよりも高機能です。
ctags(Vi用)とetags(Emacs用)は昔からあるツールです。
gtagsについてはここを参考にしてください。
で本題の反応速度ですがViでは一瞬で飛びます。
Emacsは使用したことがないですが多分違いはあまりないのではないかと思います。
ちなみに自分の環境はUbuntu-ja 7.10です。
ありがとうございます。
ctagsを試してみたところ、非常に速く実用できる速度で使用できました。
globalは高機能な分、重かったのかもしれません。
しかし、manpageが気になるところです。存在するならば使用したいような。。。だめならalienでsuseのrpmを入れてしまおうか。
まだまだ回答募集中です。
追記:
自己レスですいませんが、kernelのmanpageをインストールする方法がわかりました。
kernel ソースのトップから以下コマンドでできました。あー、うれしい。
$ sudo make installmandocs
参照元:http://f42.aaa.livedoor.jp/~hassaku/crswikicrs/?LinuxDriver%A4%D...
さっそくの回答ありがとうございます。
ctagsについては質問文で書いたgtagsと同様なものと理解しているのですが、kernel程度の規模のソースコードであっても実用レベルの反応速度で使用できますか?(ここの部分再度回答いただきたいです。)
Linuxデバイスドライバの本はすでに持っていますが、「The Linux Kernel Module Programming Guide」は知りませんでした。良さそうなサイトですね。ありがとうございます。
ちなみにsuseには存在しているようです、と書いたmanpageは以下URLに存在していました。
http://72.14.235.104/search?q=cache:7EIk-63SmusJ:rpmfind.net/lin...
「頑張る」の方向が見えるところまでまずはたどり着きたいと思っています。