Algumas questões relacionadas ao processo de compilação do módulo externo do kernel do Linux

3

A página de documentação do kernel Linux para construir módulos externos ( link ) diz isto:

=== 2. How to Build External Modules

     

Para construir módulos externos, você deve ter um kernel pré-construído disponível   que contém os arquivos de configuração e cabeçalho usados na construção.   Além disso, o kernel deve ter sido construído com módulos habilitados. Se você é   usando um kernel de distribuição, haverá um pacote para o kernel   você está executando fornecido pela sua distribuição.

     

Uma alternativa é usar o alvo "make" "modules_prepare". este   irá certificar-se de que o kernel contém as informações necessárias. o   O destino existe apenas como uma maneira simples de preparar uma árvore de origem do kernel   para construir módulos externos.

Minhas perguntas são as seguintes:

  1. To build external modules, you must have a prebuilt kernel available that contains the configuration and header files used in the build

Por "kernel pré-construído", significa a imagem binária compilada (geralmente chamada vmlinux / vmlinuz)? Por que exatamente a imagem binária é necessária? Os arquivos de configuração, os arquivos de cabeçalho e o compilador não deveriam ser suficientes?

  1. To build external modules, you must have a prebuilt kernel available that contains the configuration and header files used in the build.

Se por kernel pré-construído, significa a imagem binária, então qual é o significado de "contém os arquivos de configuração e cabeçalho"? Eu posso entender a árvore de origem que precisa "conter os arquivos de configuração e cabeçalho", mas no caso de binário, esses arquivos são usados apenas para gerar instruções, certo? Qual é o significado de "conter" então? Por "kernel pré-construído" significa toda a árvore de código-fonte onde o kernel foi construído?

  1. Also, the kernel must have been built with modules enabled.

Eles estão se referindo à etapa "make modules" aqui ou é algo diferente?

  1. If you are using a distribution kernel, there will be a package for the kernel you are running provided by your distribution.

Suponho que eles estejam se referindo ao pacote kernel-devel aqui, que fornece os arquivos de cabeçalho e configuração que foram usados no processo de construção do kernel. Isso está correto?

  1. An alternative is to use the "make" target "modules_prepare." This will make sure the kernel contains the information required.

Qual é o significado disso? Isso significa que não precisamos ter um binário de kernel construído para podermos construir módulos externos se fizermos um "make modules_prepare" no diretório de origem?

    
por Lavya 05.07.2015 / 09:14

1 resposta

3

ad 1. e 2. A imagem do kernel é chamada vmlinux, mas isso não é o que você realmente precisa quando você quer construir módulos externos. É a configuração e os arquivos de cabeçalho deste kernel que é necessário.

ad 3. Para construir módulos, internos ou externos, você precisa de suporte para módulos carregáveis neste kernel, você quer construir o módulo, é claro, então o kernel precisa ser configurado com __modules ativados _.

Um kernel é configurado por um dos programas de configuração que ajudam na criação de um arquivo .config , na árvore de origem do kernel ou no caminho $KBUILD_OUTPUT , para compilações fora da árvore.

ad 4. Onde você encontra esses pacotes ou como eles são nomeados depende da sua distribuição, mas eu acho que é frequentemente chamado de kernel-devel . Eu não sei porque eu usei minha própria árvore do kernel por anos.

ad 5. Sim, você realmente não precisa do binário do kernel, para compilar um módulo externo, mas você suprimiu a nota abaixo

NOTE: "modules_prepare" will not build Module.symvers even if CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be executed to make module versioning work.

A maioria dos kernels usa CONFIG_MODVERSIONS, eu acho. Você pode ver isso no seu arquivo .config com

$ grep MODVERSIONS .config
CONFIG_MODVERSIONS=y

Isto significa que o seu módulo construído funcionará apenas para a versão do kernel e configuração para a qual você o construiu.

Portanto, você pode criar um módulo para essa versão do kernel e do kernel, mas não pode executá-lo sem o kernel e a versão do kernel.

É por isso que você pode criar um módulo externo para um kernel de distribuição sem a árvore fonte completa do kernel, se você instalar a configuração do kernel e os arquivos de cabeçalho, esse kernel de distribuição foi construído.

Na verdade, na maioria das vezes você só quer construir um módulo externo para o kernel com o qual você executa seu sistema. Se você construiu o kernel você mesmo, a partir da árvore de fontes do kernel, você já terá uma configuração de kernel e arquivos de cabeçalho, que combinam com o kernel.

Se você executar um kernel de distribuição, precisará instalar esses arquivos a partir da distribuição.

    
por 05.07.2015 / 09:38