どのカーネル設定オプションが私のドライバを有効にしているかどうかはどうすればわかりますか?

どのカーネル設定オプションが私のドライバを有効にしているかどうかはどうすればわかりますか?

重要な要約:
USB DAQデバイス用のドライバをコンパイルしようとしたときにカーネルを再設定しました。ドライバはデフォルトのディストリビューションのカーネルでコンパイルすることを拒否しましたが、すべてが私が調整したカーネルで動作しました。

ドライバは2つのカーネルモジュールで構成されています。どのオプションを変更したかを知っていますが、どの特定の設定オプションが私のドライバを有効にしたかを知りたいです。可能なすべてのオプションの組み合わせを試みる(カーネルを構成してコンパイルする)ことなくこの問題を解決する方法はありますか?

より長いストーリー:
openSUSE 11.4などのさまざまなデプロイ用ドライバに付属のAdvantech USB-4702 DAQデバイスがあります。ソースでコンパイルし、サポートされているディストリビューションで正しくコンパイルする必要があります(カーネル2.6.37.6-24-desktopでopenSUSE 11.4 32ビットを試しました)。

SLES 11 SP 3(64ビット、カーネル3.0.76-0.11 - デフォルト)で動作しようとすると、コンパイルエラーが発生します。そのうちの1つは、ソースコードの次のコードによって引き起こされます。

#ifndef CONFIG_USB
#  error "This driver needs to have USB support."
#endif

そのため、実行中のカーネル(/proc/config.gzで)の設定オプションを調べたところ、CONFIG_USBが有効になっていることがわかりました(無効にするとUSBキーボードとマウスが使用できなくなるようです)。その後、カーネル構成の使用を開始し、その一部(一部はモジュロ)を有効にしました。カーネルをコンパイル、インストール、再起動しました。これにより、ドライバはエラーや警告なしにコンパイルされ、デバイスを使用できるようになります。

問題は、ドライバのコンパイルを「有効にする」特定のオプションが何であるかをどうやって知ることができますか?どのオプションが変更されたかを知っていますが、ドライバに必要でないものは有効にしたくありません。私は可能なすべてのオプションの組み合わせでカーネルを設定してコンパイルしたくありません。

ベストアンサー1

私は問題のドライバがモジュールにコンパイルされたと仮定します。必要なコンポーネントもモジュールとしてビルドすると簡単に見つけることができます。すべてのモジュールとそのオプションはカーネルmakefileに文書化されています。したがって、grepを使用してモジュール名を見つけることができます。

ただし、まずドライバがどのモジュールに依存しているかを調べる必要があります。したがって、aを発行lsmodし、特にColumnでドライバを検索してくださいUsed by。ドライバを例に挙げてみましょうrt2800usb

$ lsmod | grep rt2800usb
rt2800usb  15392   0  
rt2x00usb  8306    1  rt2800usb
rt2800lib  59262   1  rt2800usb
rt2x00lib  34431   3  rt2x00usb,rt2800lib,rt2800usb
usbcore    146570  7  rt2x00usb,rt2800usb

rt2x00usbこれは私のドライバにモジュールとrt2800libが必要であることを伝えますrt2x00libusbcoreこれでMakefileで検索します。.o検索文字列の前後にスペースに注意してください。

$ fgrep -r --include=Makefile ' usbcore.o'
drivers/usb/core/Makefile:obj-$(CONFIG_USB) += usbcore.o

$ grep -Pr --include=Makefile ' rt2(x|8)00(usb|lib)\.o'
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800_LIB) += rt2800lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800USB) += rt2800usb.o

これには、これらのモジュールを構築するために必要な設定オプションがあります。犯人がすぐに見つからない場合は、依存関係の依存関係をもう少し詳しく調べてください。名前を推測できる場合は、組み込みオブジェクト(モジュールとは反対)にも役立ちます。

(この記事のすべてのコマンドライン出力は読みやすくするために軽く圧縮され、フォーマットされています。)

おすすめ記事