web-dev-qa-db-ja.com

Linuxカーネルモジュールを組み込みではなくモジュールとしてコンパイルするように強制します

私は 組み込みLinuxボックスのカーネルのソース (具体的にはQNAP NAS)を持っています。これは、カーネル構成ファイルとともに64ビットv3.12.6Linuxカーネルを実行しています。

私がやろうとしているのは、 insmod を使用してシステムに追加できるカーネルモジュールを追加することにより、そのカーネルにDVBサポートを追加することです。ただし、このバージョンを使用すると、組み込みでのみ使用可能な dvb-core.ko をコンパイルできません(つまり、 CONFIG_DVB_CORE = y CONFIG_DVB_CORE = m の代わりに。

ボックスモデルに関連する構成ファイルを確認しましたが、DVB構成スイッチが設定されていません。

# cat ../../kernel_cfg/TS-X53/linux-3.12.6-x86_64-hal.cfg | grep DVB
# CONFIG_DVB_DUMMY_FE is not set

そのため、そのファイルをカーネルソースディレクトリに。configとしてコピーし、 make menuconfig を実行しました。オプションをチェックしました:

Device Drivers -> Multimedia Support -> Digital TV Support

その行で [〜#〜] m [〜#〜] を押すことはできないので、 [〜#〜] y [〜#〜]を押します。 ;有効にした後、DVB_COREを検索すると( /キーを使用)、次のようになります。

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=y]                                                 |  
| Type  : tristate                                                      |  
|   Defined at drivers/media/Kconfig:117                                |  
|   Depends on: MEDIA_SUPPORT [=y] && MEDIA_DIGITAL_TV_SUPPORT [=y]     |  
|   Selects: CRC32 [=y]                                                 |
-------------------------------------------------------------------------

したがって、さまざまなチューナードライバーをモジュールとして有効にした場合(dvb-usb-dib0700.koなど)、保存して終了し、 makeモジュールを実行します。 、すべてのチューナー。koファイルを取得しますが、システムに必要な dvb-core.ko は取得しません。他の依存.koファイルをロードします。終了後の設定スイッチは次のとおりです。

# cat .config | grep DVB
CONFIG_DVB_CORE=y
CONFIG_DVB_NET=y
CONFIG_DVB_MAX_ADAPTERS=8
# CONFIG_DVB_DYNAMIC_MINORS is not set
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
# CONFIG_DVB_USB_A800 is not set
# CONFIG_DVB_USB_DIBUSB_MB is not set
# CONFIG_DVB_USB_DIBUSB_MC is not set
CONFIG_DVB_USB_DIB0700=m
# CONFIG_DVB_USB_UMT_010 is not set
# CONFIG_DVB_USB_CXUSB is not set
# CONFIG_DVB_USB_M920X is not set
# CONFIG_DVB_USB_DIGITV is not set
# CONFIG_DVB_USB_VP7045 is not set
# CONFIG_DVB_USB_VP702X is not set
# CONFIG_DVB_USB_GP8PSK is not set
# CONFIG_DVB_USB_NOVA_T_USB2 is not set
# CONFIG_DVB_USB_TTUSB2 is not set
# CONFIG_DVB_USB_DTT200U is not set
# CONFIG_DVB_USB_OPERA1 is not set
# CONFIG_DVB_USB_AF9005 is not set
# CONFIG_DVB_USB_PCTV452E is not set
# CONFIG_DVB_USB_DW2102 is not set
# CONFIG_DVB_USB_CINERGY_T2 is not set
# CONFIG_DVB_USB_DTV5100 is not set
# CONFIG_DVB_USB_FRIIO is not set
# CONFIG_DVB_USB_AZ6027 is not set
# CONFIG_DVB_USB_TECHNISAT_USB2 is not set
# CONFIG_DVB_USB_V2 is not set
# CONFIG_DVB_TTUSB_BUDGET is not set
# CONFIG_DVB_TTUSB_DEC is not set
# CONFIG_DVB_B2C2_FLEXCOP_USB is not set
# DVB-S (satellite) frontends
# DVB-T (terrestrial) frontends
CONFIG_DVB_DIB3000MC=m
CONFIG_DVB_DIB7000M=m
CONFIG_DVB_DIB7000P=m
# DVB-C (cable) frontends
CONFIG_DVB_LGDT3305=m
CONFIG_DVB_S5H1411=m
CONFIG_DVB_DIB8000=m
CONFIG_DVB_TUNER_DIB0070=m
CONFIG_DVB_TUNER_DIB0090=m
# SEC control devices for DVB-S
# CONFIG_DVB_DUMMY_FE is not set

。configファイルを手動で編集し、 CONFIG_DVB_CORE = m 保存してから、モジュールを作成何も変わりません:

# make modules
scripts/kconfig/conf --silentoldconfig Kconfig
#
# configuration written to .config
#
make[1]: Nothing to be done for `relocs'.
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  Building modules, stage 2.
  MODPOST 195 modules

dvb-core.ko はまだコンパイルされておらず、設定も元に戻されます。

# cat .config | grep DVB_CORE
CONFIG_DVB_CORE=y

だから私の質問は:どうすれば dvb-core.ko をカーネルモジュールとしてコンパイルできますか?

カーネル3.4.6を使用していた 以前のカーネルソース を使用すると、 make menuconfig を使用して、これを簡単に実行できることに注意してください。 DVB設定で [〜#〜] m [〜#〜] を設定します。しかし、DVBがここにあったので、メニューは異なっていました:

Device Drivers -> Multimedia Support -> DVB for Linux

そしてこれはDVB_COREの検索結果でした:

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=m]                                                 |  
| Type  : tristate                                                      |  
| Prompt: DVB for Linux                                                 |  
|   Defined at drivers/media/Kconfig:69                                 |  
|   Depends on: MEDIA_SUPPORT [=y]                                      |  
|   Location:                                                           |  
|     -> Device Drivers                                                 |  
|       -> Multimedia support (MEDIA_SUPPORT [=y])                      |  
|   Selects: CRC32 [=y]                                                 |  
-------------------------------------------------------------------------

そして(古い)設定スイッチ:

# cat .config | grep DVB
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_VIDEO_BT848_DVB=y
CONFIG_DVB_MAX_ADAPTERS=8
# CONFIG_DVB_DYNAMIC_MINORS is not set
CONFIG_DVB_CAPTURE_DRIVERS=y
CONFIG_DVB_AV7110=m
# CONFIG_DVB_AV7110_OSD is not set
CONFIG_DVB_BUDGET_CORE=m
CONFIG_DVB_BUDGET=m
CONFIG_DVB_BUDGET_CI=m
CONFIG_DVB_BUDGET_AV=m
CONFIG_DVB_BUDGET_PATCH=m
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
CONFIG_DVB_USB_A800=m
CONFIG_DVB_USB_DIBUSB_MB=m
CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
CONFIG_DVB_USB_DIBUSB_MC=m
CONFIG_DVB_USB_DIB0700=m
... cut ...
2
virtualdj

どうやらソリューションは簡単に適用できましたが、推測するのはそれほど簡単ではありませんでした。 dvb-core.koをモジュールとしてビルドするには、メニューに戻る必要がありました。

Device Drivers -> Multimedia support

そこで、マルチメディアサポートはカーネル構成ファイルによって[〜#〜] y [〜#〜]としてすでにマークされています。

<*> Multimedia Support --->

解決策は、マルチメディアサポートを選択し、[〜#〜] m [〜#〜]を押してモジュールとしてマークすることです。

<M> Multimedia Support --->

したがって、基本的にモジュールの選択を行う必要があります親メニュー、最初はデジタルTVサポートにあると思っていました。次に、 DVB_CORE を検索すると、次のように正しく表示されます。

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=m]                                                 |  
| Type  : tristate                                                      |  
|   Defined at drivers/media/Kconfig:117                                |  
|   Depends on: MEDIA_SUPPORT [=m] && MEDIA_DIGITAL_TV_SUPPORT [=y]     |  
|   Selects: CRC32 [=y]                                                 |
-------------------------------------------------------------------------
1
virtualdj