O que uma árvore de código-fonte do kernel contém? Isso está relacionado aos cabeçalhos do kernel do Linux?

22

Em livros, normalmente leio referências à Árvore de origens do Linux em /usr/src/linux com o conjunto usual de subdiretórios ( arch , block , crypto , ...).

Eu esperava que esta árvore contivesse os arquivos binários que compõem o kernel. No meu sistema (Ubuntu 10.04) ...

  1. para os diferentes kernels que tenho (usando downloads de software automatizados, não instalados manualmente), eu acho nesta localização dois subdiretórios para cada kernel da seguinte forma:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. Nos subdiretórios esperei arquivos binários, entre outros. No entanto, eu verifiquei uma quantidade razoável da árvore, e o último subdiretório daqui parece ter sempre um Makefile (ao lê-lo, soa tipicamente mais como um arquivo de configuração do que um arquivo de instalação), e ocasionalmente alguns isolou outros arquivos (principalmente Kconfig ).

Minha pergunta pode ser ingênua, mas estou um pouco confusa. É (2) o que eu deveria esperar ver na Árvore de Origem do Kernel; e por que tenho a referência explícita a "cabeçalhos"? Eu precisava instalar o linux-generic-headers há algum tempo para algum outro software e não tenho certeza se isso pode estar relacionado. Eu percebo que há uma boa razão para os makefiles (por exemplo, para instalar módulos no subdiretório / driver), mas (praticamente) somente makefiles?

    
por gnometorule 17.12.2011 / 14:46

1 resposta

27

Distribuição kernel-header packages contém, como o próprio nome indica, apenas arquivos de cabeçalho do kernel (mais o encanamento necessário) que são necessários para construir softwares como módulos do kernel.

Você não deve esperar encontrar arquivos binários em um diretório do kernel source , exceto para a saída de compilação. (Se você configurar e construir um kernel você mesmo, o diretório fonte do kernel também conterá os objetos compilados, módulos, o próprio kernel construído e alguns outros bits binários que o fazem funcionar.)
KConfig files are a descrição das opções de configuração do kernel (e suas dependências) que estão disponíveis para um determinado diretório / módulo.
Além disso, é tudo (principalmente) código-fonte C, arquivos de cabeçalho e Makefile s. Existem alguns scripts auxiliares aqui e ali, e a fonte de montagem também.

Pacotes de cabeçalho (o que você instalou) contém apenas a parte cabeçalho do acima (e não tudo isso - somente os cabeçalhos "exportados"), e alguns a infraestrutura de construção. Então, o que você está vendo é esperado. Pacotes de cabeçalho não contêm código-fonte C (exceto alguns stubs e código de infraestrutura de construção). O objetivo de ter esse tipo de pacote é economizar espaço (e largura de banda) - toda a árvore de código-fonte do kernel do Linux é bastante grande e completamente desnecessária se você não pretende compilar o kernel sozinho. Os pacotes de cabeçalho são construídos e enviados por distribuições para fornecer as coisas certas necessárias para construir módulos, mas não mais. (Eles certamente não contêm o kernel compilado.)

Enfrentando seu comentário: os pacotes de cabeçalho não são transferidos para lugar nenhum. Eles são construídos para versões específicas do kernel, empacotados em um diretório específico, e é isso. É apenas um conjunto de arquivos. (Note que os pacotes de cabeçalho não têm necessariamente a mesma versão dos pacotes binários atuais do kernel estável - os pacotes de cabeçalho são genéricos e podem ficar atrás do kernel real que você está executando. Eles não devem, no entanto, ser de um kernel versão mais recente que o kernel atual instalado (ou de destino).

Os binários do kernel instalados são geralmente instalados no diretório /boot , juntamente com binários do gerenciador de inicialização e arquivos de configuração. (Às vezes, esse é um sistema de arquivos independente, não montado por padrão). O nome exato dos arquivos depende do kernel e da distribuição. (O mesmo acontece com o bootloader.)

Os módulos do kernel instalados residem em subdiretórios de:

/lib/modules/'uname -r'/

Por exemplo, no meu sistema, eles estão atualmente em

/lib/modules/3.1.4-gentoo/

Código-fonte completo do kernel : No Ubuntu, se você quer que as fontes completas do kernel construam um kernel, você deve instalar seguindo as instruções aqui .

Você também pode baixar um tarball de origem de kernel.org e descompactá-lo em algum lugar (fazer não substituir arquivos instalados pelo Ubuntu se você usar este tarball, manter suas coisas pessoais e as coisas gerenciadas por RPM separadas ).

/usr/src/linux é um local tradicional para colocar fontes do kernel, mas nada impede que você coloque fontes do kernel em outro lugar. Este caminho também é muitas vezes apenas um link simbólico para um diretório. por exemplo. Eu tenho isso na minha máquina:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

O link simbólico está lá para simplificar a criação de aplicativos que dependem da fonte do kernel. Você vincula esse caminho ao kernel em execução (ou destino) para que não precise especificar informações de versão ou caminho exatas ao criar um módulo fora da árvore. Ajuda um monte de distribuições baseadas em fontes, pelo menos.

    
por 17.12.2011 / 15:09