Pergunta

Sempre fui atraído pelo mundo do hacking de kernel e dos sistemas embarcados.
Alguém tem bons tutoriais (+hardware facilmente disponível) sobre como começar a mexer com essas coisas?
Algo como kits para escrever drivers, etc., que vêm com boa documentação e são acessíveis?

Obrigado!

Foi útil?

Solução

Se você é completamente novo no desenvolvimento do kernel, eu sugiro não começar com o desenvolvimento de hardware e ir para alguns módulos do kernel "somente software", como proc file/sysfs ou para exemplos mais complexos de desenvolvimento de sistema de arquivos/rede, desenvolvendo em uml/vmware/ caixa virtual/...máquina, então travar sua máquina não vai doer tanto :) Para desenvolvimento embarcado você pode optar por um pequeno kit de desenvolvimento ARM ou uma pequena máquina Via C3/C4, ou qualquer PC antigo que você possa gravar com seu homebrew USB / PCI / qualquer que seja dispositivo.

Um bom lugar para começar é provavelmente Kernelnewbies.org - que contém muitos links e informações úteis para desenvolvedores de kernel, e também apresenta uma lista de tarefas fáceis de implementar para iniciantes.

Alguns livros para ler:

Compreendendo o kernel do Linux - uma referência muito boa detalhando o design dos subsistemas do kernel

Drivers de dispositivos Linux - é escrito mais como um tutorial com muitos exemplos de código, com foco em você começar e explicar os principais aspectos do kernel do Linux.Ele apresenta o processo de construção e os fundamentos dos módulos do kernel.

Guia de programação do módulo Kernel Linux - Mais algum material introdutório

Como sugerido anteriormente, olhar o código Linux é sempre uma boa ideia, especialmente porque as APIs do Kernel Linux tendem a mudar com bastante frequência...O LXR ajuda muito com uma interface de navegação muito agradável - lxr.linux.no

Para entender o processo de construção do Kernel, este link pode ser útil:

Makefiles do Kernel Linux (kbuild)

Por último, mas não menos importante, navegue no diretório Documentation da distribuição Kernel Source!

Aqui estão alguns exercícios interessantes roubados insolentemente de uma aula de desenvolvimento de kernel:

  • Escreva um módulo do kernel que crie o arquivo /proc/jiffies relatando a hora atual em instantes em cada acesso de leitura.
  • Escreva um módulo do kernel fornecendo o arquivo proc /proc/sleep.Quando um aplicativo grava um número de segundos como texto ASCII neste arquivo ("echo 3 > /proc/sleep"), ele deve bloquear pela quantidade especificada de segundos.Os acessos de escrita não devem ter nenhum efeito colateral no conteúdo do arquivo, ou seja, nos acessos de leitura, o arquivo deve parecer vazio (ver LDD3, cap.6/7)
  • Escreva um arquivo proc onde você possa armazenar algum texto temporariamente (usando echo "blah" > /proc/pipe) e retire-o novamente (cat /proc/pipe), limpando o arquivo.Cuidado com problemas de sincronização.
  • Modifique o módulo de exemplo de pipe para registrar como um dispositivo de caractere /dev/pipe, adicione alocação de memória dinâmica para solicitações de gravação.
  • Escreva um sistema de arquivos realmente simples.

Outras dicas

Um absoluto deve é esse livro de Rubini.(disponível em cópia impressa ou em cópia eletrônica gratuita)

Ele fornece implementações de vários drivers fictícios que não exigem que você tenha outro hardware além do seu PC.Então, para começar no desenvolvimento do kernel, é o caminho mais fácil.

Quanto ao trabalho incorporado, eu recomendaria comprar um dos numerosos SBC (computadores de placa única) que existem por aí.Existem vários deles baseados em processadores x86, geralmente com interfaces PC/104 (eletricamente PC/104 é idêntico ao padrão de barramento ISA, mas baseado em conectores empilháveis ​​em vez de conectores de borda - muito fácil de conectar hardware personalizado)

Eles geralmente possuem conectores VGA que facilitam a depuração.

Para hackear Linux embarcado, o roteador Linksys WRT54G simples que você pode comprar em qualquer lugar é uma plataforma de desenvolvimento por si só http://en.wikipedia.org/wiki/Linksys_WRT54G_series:

O WRT54G se destaca por ser o primeiro dispositivo de rede para consumidor que teve seu código-fonte de firmware liberado para satisfazer as obrigações da GNU GPL.Isso permite que os programadores modifiquem o firmware para alterar ou adicionar funcionalidade ao dispositivo.Vários projetos de firmware de terceiros fornecem ao público firmware aprimorado para o WRT54G.

Eu tentei instalar OpenWrt e DD-WRT firmware nele.Você pode verificá-los como ponto de partida para hackear em uma plataforma de baixo custo.

Para começar, a melhor maneira é ler muito código.Como o Linux é de código aberto, você encontrará dezenas de drivers.Encontre um que funcione de certa forma como o que você deseja escrever.Você encontrará alguns códigos decentes e relativamente fáceis de entender (o dispositivo de loopback, ROM fs, etc.)

Você também pode usar o lxr.linux.no, que é o código Linux com referência cruzada.Se você precisa descobrir como algo funciona e precisa examinar o código, esta é uma maneira boa e fácil.

Há também um livro da O'Reilly (Understanding the Linux Kernel, a 3ª edição é sobre os kernels 2.6) ou se você quiser algo de graça, você pode usar o livro Advanced Linux Programing (http://www.advancedlinuxprogramming.com/).Há também muita documentação específica sobre sistemas de arquivos, redes, etc.

Algumas coisas para estar preparado:

  • você estará compilando cruzadamente.O dispositivo incorporado usará uma CPU MIPS, PowerPC ou ARM, mas não terá capacidade de CPU, memória ou armazenamento suficiente para compilar seu próprio kernel em um período de tempo razoável.
  • Um sistema embarcado geralmente usa uma porta serial como console e, para reduzir o custo, geralmente não há conector soldado nas placas de produção.Depurar kernel panics é muito difícil, a menos que você possa soldar um conector de porta serial, você não terá muitas informações sobre o que deu errado.

O Linksys NSLU2 é uma maneira barata de fazer com que um sistema embarcado real funcione e possui uma porta USB para adicionar periféricos.Qualquer um dos vários pontos de acesso sem fio também pode ser usado; consulte o Página de compatibilidade OpenWrt. Esteja ciente de que os modelos atuais do Linksys WRT54G que você encontra nas lojas não podem mais ser usados ​​com Linux:eles têm menos RAM e Flash para reduzir custos.A Cisco/Linksys agora usa vxWorks no WRT54G, com menor consumo de memória.

Se você realmente quiser entrar nisso, os kits de avaliação para CPUs embarcadas custam a partir de algumas centenas de dólares americanos.Eu recomendo não gastar dinheiro com isso, a menos que você precise dele profissionalmente para um trabalho ou contrato de consultoria.

Sou completamente iniciante em hacking de kernel :) Decidi comprar dois livros "Desenvolvimento de Programas Linux:um guia com exercícios" e "Escrevendo drivers de dispositivos Linux:um guia com exercícios" Eles são escritos de forma muito clara e fornecem uma boa base para aprendizado adicional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top