Posicionamento do binário do kernel e fontes para a construção do módulo do kernel?

2

Estou tentando configurar um ambiente para o desenvolvimento de módulos do kernel no Linux. Eu construí o kernel na pasta home e gostaria de colocar as fontes e os binários no lugar correto para incluir corretamente.

O exemplo para construir o módulo do kernel inclui os seguintes itens:

#include <linux/init.h>
#include <linux/module.h>

Quais são os caminhos absolutos que o vinculador procura nesses cabeçalhos?

    
por TheMeaningfulEngineer 20.04.2014 / 13:16

3 respostas

2

Eu geralmente abordo essa questão assim. Eu estou em um sistema Fedora 19 mas isso funcionará em qualquer distro que forneça locate services.

$ locate "linux/init.h" | grep include
/usr/src/kernels/3.13.6-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.7-100.fc19.x86_64.debug/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64/include/linux/init.h
/usr/src/kernels/3.13.9-100.fc19.x86_64.debug/include/linux/init.h

Seus caminhos serão diferentes, mas a chave é que você queira perguntar a locate para encontrar o que está sendo incluído ("linux / init.h") e filtrar esses resultados procurando a palavra-chave include .

Existem também maneiras específicas de distribuição para procurar esses locais usando RPM (Redhat) ou APT (Debian / Ubuntu).

gcc

Observe, entretanto, que os caminhos dentro do arquivo C / C ++ são relativos:

#include <linux/init.h>

Isso ocorre quando você chama o compilador, gcc , pode substituir o local dos arquivos de inclusão que deseja usar. Isso é controlado através do switch -I <dir> .

trecho do man gcc

   -I dir
        Add the directory dir to the list of directories to be searched for 
        header files.  Directories named by -I are searched before the 
        standard system include directories.  If the directory dir is a
        standard system include directory, the option is ignored to ensure 
        that the default search order for system directories and the special 
        treatment of system headers are not defeated .  If dir
        begins with "=", then the "=" will be replaced by the sysroot 
        prefix; see --sysroot and -isysroot.

Módulos externos

Há este artigo que discute como alguém incorporaria o desenvolvimento de seus próprios módulos do kernel no "ambiente de criação" incluído no kernel do Linux. O artigo é intitulado: Portando driver: compilando módulos externos . A organização do makefile do Kernel também é abordada neste artigo: makefiles.txt .

Para iniciantes do Kernel, há também este artigo: KernelHeaders do site kernelnewbies.org.

NOTA: O Kernel usa o sistema KBuild, que é coberto aqui como parte da documentação incluída no Kernel.

Referências

por 20.04.2014 / 15:18
1

As respostas geralmente são específicas da distribuição, porque podem ter um mecanismo específico para isso. No caso do Debian, existe o Manual do Kernel do Debian Linux . Como o Ubuntu é essencialmente Debian, tudo isso deve se aplicar. Se bem entendi, você está perguntando sobre a instalação do kernel. Uma abordagem, boa, é construir um pacote binário para os cabeçalhos kernel e kernel, e instalá-los, e este manual mostra como. Veja também minha resposta para "Como faço para atualizar o kernel do Debian Wheezy offline?" . Esta resposta realmente poderia fazer com alguma limpeza.

Note que usar os pacotes binários de kernel Debian / kernel do Ubuntu e do kernel é algo totalmente razoável, e não requer uma compilação.

    
por 20.04.2014 / 14:03
1

O kernel tem um alvo deb-pkg . No debian, make deb-pkg e sudo dpkg -i 'dos dois pacotes resultantes (em ../ ) funcionaram como um encanto para mim. Eu acho que funciona da mesma maneira no Ubuntu. Em construir e instalar, esses incluem acabar nos lugares certos automaticamente.

    
por 20.04.2014 / 19:17