Melhor maneira de entrar na programação do Kernel?

8

Não é muita pergunta sobre quais livros (embora você saiba de algum guia / tutorial que seria útil), mas qual é a melhor maneira de começar a fazer a programação do kernel e existe uma distribuição específica que seria melhor aprender?

Estou interessado principalmente na parte dos drivers de dispositivo, mas quero aprender como o Kernel também está configurado (Módulos e similares). Tenho cerca de 4-5 anos de experiência com C / C ++, mas principalmente conhecimento da faculdade (por isso é não gosta de 4-5 anos de experiência profissional, se você entende o que eu quero dizer)

Jeff Schaller
fonte
4
Para começar, é soletrado kernel com um e.
Caleb
Ya notei que quando eu estava colocando as tags lol.
4
Da próxima vez, reserve um tempo para corrigi-lo. É uma boa maneira de respeitar a comunidade aqui que está gastando tempo para ajudá-lo. Além disso, se você quiser codificar para o kernel, precisará ser rigoroso com detalhes como esse!
Caleb
@ Caleb, vai fazer!
Obrigado por fazer esta pergunta, eu sempre me perguntava
Mike Pennington

Respostas:

11

Primeiramente:

Para os estágios iniciais, escrever várias variações nos módulos "olá mundo" e nos drivers de hardware virtual é a melhor maneira de começar (o hardware real apresenta os problemas do mundo real mais bem enfrentados quando você tem mais idéia do que está fazendo).

"Linux Device Drivers" é um excelente livro e vale a pena começar com: http://lwn.net/Kernel/LDD3/

O LDD (costumava, pelo menos) ter exercícios nos quais você gravou drivers virtuais, por exemplo, discos RAM e dispositivos de rede virtual.

Em segundo lugar:

inscreva-se em https://lkml.org/ ou na lista de e-mails de um subsistema em que você estará invadindo. Espreite um pouco, examinando tópicos, lendo a revisão de código (respostas a patches) para ver que tipo de coisas as pessoas tropeçar ou pegar.

Veja se você pode obter hardware (barato) para um dispositivo que ainda não é suportado ou ainda não é suportado. Bons candidatos são NICs USB baratas ou periféricos USB de baixo custo semelhantes. Algo com um driver desatualizado ou fora da árvore, talvez escrito por fornecedor, talvez para 2.4.x, é ideal, pois você pode começar com algo que funcione (mais ou menos) e adaptá-lo / reescrever gradualmente testando à medida que avança. Minha primeira tentativa de driver foi para uma placa de rede Davicom DM9601 USB. Havia um driver do kernel gravado pelo fornecedor da série 2.4 que eu adaptei lentamente para o 2.6. (Nota: o motorista na linha principal não é o meu motorista, no final, alguém escreveu outro a partir do zero).

Outra boa maneira é consultar o site Kernel Newbies, especificamente o todo "kernel janitors": http://kernelnewbies.org/KernelJanitors/Todo Esta é uma lista de tarefas que um iniciante deve ser capaz de enfrentar.

jmtd
fonte
4
Boa resposta para o Linux, faltando apenas um recurso: o LXR para navegar na fonte do kernel.
Gilles 'SO- stop be evil'
8

Existem muitos núcleos existentes.

Linuxnão é o único jogo por aí, mas é o mais usado. Algumas pessoas recomendam o minixkernel para entender os conceitos de sistema operacional. Eu iria com a série Linux 2.6.x, pois é a mais comum e não será desperdiçada em algo (quase) que ninguém usa. O Solaris, XNU (Mac), FreeBSD e Dragonfly são notáveis. 1

Encontre algo super simples (porta serial, usb, etc.) e faça-o fazer outra coisa. Para um desafio extra, tente escrever um módulo do kernel para algo que ainda não o tenha. (Certifique-se de procurar o suspeito no Google por pci sudo lspci -nne / ou id USB sudo lsusbprimeiro.)

Atualização: não faça isso diretamente no sistema principal, use máquinas virtuais (VM) (computador em um computador) conforme mencionado. O VirtualBox pode fornecer isso e é grátis. Além disso, não quero que isso pareça impressionante, mas tente os instantâneos da VM para poder voltar caso algo quebre a própria VM.

Atualização 2 : A observação sobre o Git (DVCSes, incluindo mercurial, fóssil, bazar, dars) é uma boa idéia, principalmente para código e arquivos pequenos e importantes. Tente não usar o Git para fazer backup de músicas, vídeos e outros, a menos que conheça as implicações. ;)

dhchdhd
fonte
6

Encontre um módulo ou driver que você deseja modificar ou comece com um tipo de módulo nulo / olá mundo e construa a partir daí. Trabalhe especificamente com um módulo, pois permitirá carregar, descarregar, recompilar e recarregar o código em um kernel em execução. Mais tarde, você pode entrar nos bits principais, mas basicamente os módulos têm todos os tipos e você pode fazer praticamente o que quiser.

Segundo, use uma VM. Configure uma máquina convidada no VirtualBox ou outra na VM e faça o teste do kernel por um tempo. Dessa forma, você não matará o sistema principal quando quebrar alguma coisa, e reiniciar, voltar para um instantâneo funcional etc. é realmente fácil.

Terceiro, aprenda git.

Caleb
fonte
1

Alguém já menciona o livro "Linux Device Drivers" - este é um excelente recurso, e eu também o recomendo.

Embora a pergunta mencione que o autor não está solicitando livros especificamente, a edição mais recente do livro "Entendendo o Kernel do Linux" ( http://oreilly.com/catalog/9780596005658/ ) é inestimável para aprender sobre o kernel do Linux em geral e também contém uma seção sobre drivers de dispositivo Linux.

RESULTADOS CORPORATIVOS
fonte