Kernel beginner - obtendo o código fonte do kernel (ubuntu)

5

Eu quero tentar escrever um driver Linux. Eu estou tentando configurar meu ambiente. Meu kernel atual:

$ uname -r
4.10.0-37-generic

Eu então baixo o código fonte:

$ apt-get source linux-image-$(uname -r)
Reading package lists... Done 
Picking 'linux' as source package instead of 'linux-image-4.10.0-37-generic'
...

Eu vou compilar e modificar meu driver, ele falha. Olhando no dmesg, mostra:

version magic '4.10.17 SMP mod_unload ' should be '4.10.0-37-generic SMP mod_unload '

Neste ponto, estou confuso. Volto para a árvore de fontes que baixei e quando corro

$ make kernelversion
4.10.17

Ok, tente dois. Faça o download do kernel 4.10.17 e instale-o.

$ uname -r
4.10.17-041017-generic

Ainda erro:

version magic '4.10.17 SMP mod_unload ' should be '4.10.17-041017-generic SMP mod_unload

Então, talvez alguém possa ajudar: qual é a melhor e mais correta maneira de obter um kernel funcional e uma fonte correspondente no Ubuntu (bem, xubuntu, mas não acho que isso deva importar)? Preciso pegar o código do kernel.org e construí-lo do zero? Eu meio que quero combinar o envio do kernel do Ubuntu.

    
por Will I Am 11.10.2017 / 21:32

1 resposta

4

Existem várias abordagens ...

  1. Se você está tentando criar um módulo externo (incluindo o que está desenvolvendo), só precisa dos cabeçalhos do kernel:

    apt install linux-header-$(uname -r)
    

    Isso fornecerá os arquivos necessários para que os links simbólicos /lib/modules/$(uname -r)/{build,source} apontem para algo significativo. Então você pode construir um módulo em outro diretório executando

    make -C /lib/modules/$(uname -r)/build SUBDIRS="/path/to/your/module" modules
    

    Isso garantirá que o módulo seja criado para o kernel que você está executando.

  2. Se você quiser basear seu desenvolvimento no kernel do Ubuntu, use o pacote linux-source apropriado; para o lançamento do Ubuntu, que é atualmente linux-source-4.10.0 :

    apt install linux-source-4.10.0
    cd /usr/src
    tar xf linux-source-4.10.0.tar.bz2
    

    Isso incluirá os patches do kernel do Ubuntu, permitindo que você construa um kernel com os mesmos recursos do seu kernel atual. Observe, no entanto, a advertência da descrição da embalagem:

    This package is mainly meant for other packages to use, in order to build custom flavours.

    If you wish to use this package to create a custom Linux kernel, then it is suggested that you investigate the package kernel-package, which has been designed to ease the task of creating kernel image packages.

    If you are simply trying to build third-party modules for your kernel, you do not want this package. Install the appropriate linux-headers package instead.

  3. Se você quiser basear seu desenvolvimento no kernel upstream (que é o que eu recomendo), você deve clonar Linus 'tree e trabalhe lá. Para testar seu módulo, você precisa criar um kernel de upstream completo ou criar seu módulo usando a abordagem dada no ponto 1 acima.

Em qualquer caso, não é uma boa idéia usar o pacote de origem linux (conforme obtido usando apt-get source ), uma vez que é realmente projetado para construir todos os kernels usados no Ubuntu. Se você cegamente debuild usando esse pacote fonte, você vai esperar por muitas horas antes que a compilação termine ... (Existem circunstâncias em que isso é apropriado, ea documentação do kernel do Ubuntu irá explicar o que fazer, mas isso é muito provavelmente não um deles.)

    
por 12.10.2017 / 10:02