Como criar uma árvore de código-fonte do kernel?

1

Estou lendo um livro sobre a criação de drivers no Linux, não tenho muita experiência com o Linux, já instalei algumas distros antes, mas sempre usei o windows como meu principal sistema operacional.

Conheço alguns C , mas sou principalmente um programador C# .

Eu gostaria de aprender (por diversão) a programação do driver e espero que ele me ensine algumas coisas sobre o Linux e me ajude a "entrar nisso".

Meu primeiro obstáculo é encontrar uma distro com o kernel padrão 2.6.x . Eu tentei encontrar um, mas todos eles passaram 3.x agora. Alguém sabe de um adequado para esse tipo de tarefa?

Além disso, o livro diz que eu deveria obter um kernel padrão de kernel.org e construir uma árvore de fontes. Eu não tenho ideia do que isso significa, por favor, se alguém pudesse explicar os passos.

Este é o livro: link

    
por sprocket12 17.02.2014 / 17:53

3 respostas

4

Você conhece kernel.org e é aqui que você pode obter kernels de baunilha antigos ou novos. Para os kernels mais recentes, você também pode usar o git.

Uma vez que você tenha um kernel, para criar uma "árvore de fontes", você apenas descompactá-lo. Por exemplo, se você baixou um arquivo .bz2 , poderá descompactá-lo com o comando tar -jxvf <kernel version>.bz2 . Tradicionalmente esta árvore está localizada em /usr/src e o symlink /usr/src/linux é feito para apontar para o diretório específico do kernel que você está usando.

Depois de descompactar a árvore de origem, para criá-la você precisa primeiro configurá-la. make menuconfig (baseado em ncurses) ou make xconfig (baseado em X). Existem alguns outros config make targets se você estiver migrando um .config de uma versão de kernel diferente. Finalmente, para construir o kernel e seus módulos, use make . Para instalar e inicializar o kernel, use make modules_install para os módulos e copie arch/<your arch>/boot/bzImage para onde quer que seu bootloader espere que os kernels estejam e configure-o para inicializar aquele kernel. Você precisará inicializar no kernel se você espera carregar qualquer módulo que você construir contra ele.

Com isso dito, se você quiser apenas experimentar módulos de construção, simplesmente pegue o código fonte do seu kernel atual (haverá um pacote) e construa módulos com o kernel em vez de passar pelo processo acima. Não é difícil, mas se você é novo no kernel, pode ser um pouco avassalador.

    
por 17.02.2014 / 19:20
2

Já faz um tempo desde que eu joguei com drivers de kernel, mas o seguinte é o que eu configurei:

  • Uma máquina de inicialização múltipla, com pelo menos duas partições para duas distribuições
  • Uma partição com um Linux atualizado que permanece estável, a partir do qual o MBR é inicializado.
  • Uma máquina virtual com o kernel de desenvolvimento de destino, executando sob o Linux atualizado.
  • segunda partição com o kernel de desenvolvimento de destino, que é inicializado através da configuração do grub no Linux estável e atualizado.

O desenvolvimento inicial e o teste são feitos na máquina virtual (VM) com apenas drivers funcionando copiados para a máquina de desenvolvimento de destino. Você tira instantâneos regulares da VM, em particular antes de injetar um possível driver quebrado no kernel da VM. Dessa forma, você pode retroceder facilmente para um estado do sistema de desenvolvimento em funcionamento. Se você não precisa testar seu driver em hardware real, não precisa da segunda partição.

No seu caso eu instalaria algo como Ubuntu 10.04 na VM (e na segunda partição). Ele vem com um kernel 2.6 e tudo está lá e se encaixa (qualquer outra distribuição com uma versão do kernel 2.6). Você só precisa baixar as fontes do kernel e as ferramentas de desenvolvimento.

Eu acho que você vai começar a trabalhar mais rápido do que começar do zero com um novo kernel retirado do kernel.org, pelo menos, nos meus 6 dias do SuSE.

    
por 17.02.2014 / 19:18
2

De acordo com o meu comentário, tendo visto perguntas semelhantes a isso antes, decidi escrever uma versão canônica que eu acho que você deve começar a configurar, construir e instalar um kernel. Mas aqui queria abordar alguns pontos específicos do seu caso:

I wish to learn (for fun) driver programming, and hope it will teach me some things about Linux and help me "get into it".

Eu não acho que esse seja um bom motivo. 99,9% + de usuários avançados a longo prazo nunca se envolveram com programação de drivers, incluindo aqueles que usam a plataforma para desenvolvimento em C. Por analogia, se alguém que nunca usou o MS Windows antes disse a você: "Bem, eu tenho ele instalou agora, e eu pensei que uma boa maneira de aprender sobre o Windows seria começar a escrever um driver de dispositivo para ele ... ", o que você acha?

Eu começaria a brincar com o C fazendo coisas específicas da plataforma no userspace primeiro, por exemplo, sistema de arquivos e coisas de rede.

My first hurdle is to find a distro with a standard 2.6.x kernel. I tried to find one but they are all past 3.x now.

Você não precisa fazer isso. Muito provavelmente, um kernel 2.6 ainda rodará bem em uma distro atual - é fácil o bastante para tentar, é claro. Mas, além disso, se a razão é porque você está usando o LDD3 (o livro O'Reilly), um kernel 3.x ainda será compatível com a maioria ou com tudo isso. Muito (provavelmente, a maioria) do código de driver no kernel 3.x existe inalterado de 2.6, e tenho certeza que os desenvolvedores de kernel consideram uma prioridade manter essa compatibilidade com versões anteriores. A fonte de baunilha é algo como 16 milhões de LOC; nem tudo pode ser constantemente reescrito.

Então, vá em frente e tente com qualquer versão que você quiser.

    
por 17.02.2014 / 23:18