Força que um módulo do kernel Linux seja compilado como um módulo em vez de embutido

2

Eu tenho as fontes do kernel de uma caixa Linux embutida (especificamente um QNAP NAS) que está executando um kernel Linux v3.12.6 de 64 bits, junto com os arquivos de configuração do kernel.

O que eu estou tentando fazer é adicionar suporte a DVB para esse kernel, adicionando módulos de kernel que eu posso então adicionar ao sistema usando insmod . No entanto, usando esta versão, eu não consigo compilar o dvb-core.ko que está disponível apenas internamente (ou seja, CONFIG_DVB_CORE = y ao invés de CONFIG_DVB_CORE = m ).

Eu olhei para o arquivo de configuração que está relacionado ao meu modelo de caixa e não há nenhum conjunto de opções de configuração do DVB:

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

Então copiei esse arquivo como .config no diretório de fontes do kernel e execute make menuconfig . Eu verifiquei a opção:

Device Drivers -> Multimedia Support -> Digital TV Support

Não é possível clicar M nessa linha, por isso, clico Y ; e depois de ativá-lo, se eu procurar por DVB_CORE (usando a tecla / ), obtenho:

---------------------------- 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]                                                 |
-------------------------------------------------------------------------

Então, se eu ativar os vários drivers do sintonizador como um módulo (como dvb-usb-dib0700.ko ), salve, saia e execute make modules , Eu obtenho todos os arquivos .ko do sintonizador mas não o dvb-core.ko que é necessário para o meu sistema carregar os outros arquivos dependentes .ko . Estas são as opções de configuração depois de sair:

# 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

Se eu editar o arquivo .config manualmente e colocar CONFIG_DVB_CORE = m salvar e depois fazer os módulos nada mudar:

# 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

O dvb-core.ko ainda não está compilado, e também a configuração é revertida:

# cat .config | grep DVB_CORE
CONFIG_DVB_CORE=y

Então, minha pergunta é: como eu posso compilar o dvb-core.ko como um módulo do kernel?

Esteja ciente de que o uso do fontes anteriores do kernel , que estavam usando o kernel 3.4.6, eu poderia fazer isso facilmente com o make menuconfig já que eu era capaz de definir M no DVB configuração. Mas o menu era diferente como DVB estava aqui:

Device Drivers -> Multimedia Support -> DVB for Linux

E este foi o resultado da pesquisa por 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]                                                 |  
-------------------------------------------------------------------------

E os switches (antigos) de configuração:

# 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 ...
    
por virtualdj 26.04.2015 / 09:59

1 resposta

1

Aparentemente, a solução foi fácil de aplicar, mas não tão fácil de adivinhar. Para construir dvb-core.ko como um módulo, tive que voltar no menu:

Device Drivers -> Multimedia support

Lá, Suporte multimídia já foi marcado como Y pelo arquivo de configuração do kernel:

<*> Multimedia Support --->

A solução é selecionar Suporte multimídia e pressionar M para marcá-lo como um módulo:

<M> Multimedia Support --->

Então, basicamente, a seleção de módulos tem que ser feita no menu pai , enquanto eu inicialmente pensei que estava em Suporte de TV Digital . Então, ao procurar por DVB_CORE , obtenho corretamente:

---------------------------- 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]                                                 |
-------------------------------------------------------------------------
    
por 28.04.2015 / 21:43