Boas ferramentas ou métodos para entender a estrutura do gerenciador de inicialização?

9

Recentemente, descobri a causa de um bug desagradável no qual estou trabalhando com um Atmel AT91SAM9G20 SBC executando o U-boot , um carregador de inicialização de código aberto. O principal problema era que o U-boot esperava que o hardware fosse configurado de maneira diferente da que eu havia construído, portanto, alguns dos registros do dispositivo foram configurados incorretamente.

Agora que eu descobri o problema, preciso ajustar o U-boot para configurar os registros corretamente. Eu posso fazer isso às cegas adicionando algumas linhas de código no final do programa, mas isso é confuso.

Isso me leva à minha pergunta: como posso descobrir como o U-boot funciona com mais eficiência do que iniciar em main () e ler todos os caminhos de código possíveis em todos os arquivos? Tentei dar uma olhada nos arquivos e ver o código perto de identificadores relevantes. Isso se mostrou ineficaz; parece que a maior parte do código são drivers para subsistemas com os quais não me importo. Na verdade, eu entendo como o gerenciador de inicialização funciona muito bem agora, mas espero que exista um método melhor do que minha abordagem ingênua.

pingswept
fonte
Você já tentou perguntar na lista de discussão dos desenvolvedores do uboot?
sybreon

Respostas:

6

Existem várias ferramentas / estratégias que podem ajudar:

  • Melhores ferramentas para entender o código fonte:

    • cscope é uma ferramenta para explorar código C, é como grep, mas entende a sintaxe
    • Geradores de gráfico de chamada para desenhar uma imagem da estrutura de chamada de função
    • Fenris parece interessante, embora eu não tenha tentado
  • Análise de tempo de execução

    • Percorra seções interessantes com um depurador e analise o que está acontecendo
    • Use os recursos de instrumentação do gcc para chamar uma boa parte da entrada / saída de todas as funções. por exemplo. http://ndevilla.free.fr/etrace/
  • Escrevendo seu próprio mini carregador de inicialização

    • Costumo achar que a melhor maneira de entender algo é recriá-lo eu mesmo

Infelizmente, não há receita mágica que funcione para tudo.

Toby Jaffey
fonte
Análise de Tempo de Execução - Não é viável em um sistema incorporado separado, principalmente quando não há um SO subjacente em execução ao mesmo tempo, por exemplo, um carregador de inicialização.
Connor Wolf
Você ainda pode percorrê-lo com um depurador, como sugere Joby. Dependendo da complexidade, pode ou não ser útil.
Nick T
Cscope é o tipo de coisa que eu estava imaginando. Eu esperava algo um pouco mais brilhante, mas é um bom começo. Obrigado.
pingswept
2

Como você o configurou para construir para o AT91?

A árvore de códigos parece ter sido projetada de modo que qualquer material específico da arquitetura esteja localizado na árvore 'arch / (cpu class) / (tipo de cpu) / ...'. Encontrei o código AT91 em arch / arm / cpu / arm926ejs / at91 ... o material específico da variante que você deseja alterar não está localizado lá? Não há muito o que procurar nesse diretório, especialmente porque quase metade dos arquivos é específica da variante AT91 individual.

Desculpe se isso é óbvio ... mas você não mencionou a verificação.

Ainda não tinha olhado para a árvore de códigos do uBoot, mas sua postagem me assustou. Um projeto meu em segundo plano envolve eventualmente usar o uBoot e o Linux em um PCB iMX233 personalizado. Estou muito interessado em obter esse tipo de feedback sobre o quão bem a arquitetura do uBoot e as coisas específicas de variantes são isoladas e qual o tamanho de uma dor que será.

darron
fonte
Sim, passei algum tempo de qualidade com arch / arm / cpu / arm926ejs / at91 / *, mas obrigado pela sugestão. Acontece que o código que eu estava procurando estava na ROM de inicialização do processador, que somente a Atmel pode acessar. Os detalhes sangrentos estão aqui: at91.com/forum/viewtopic.php/f,9/t.19732/start,0/st,0/sk,t/sd,a
pingswept
11
A propósito, no geral, fiquei bastante impressionado com o U-boot. Para o grande número de placas e CPUs que ele suporta, é muito bem organizado. A documentação é escassa, mas isso parece ser o par para o curso dos gerenciadores de inicialização.
pingswept
@pingswept: ei, Linux em 4 camadas. Agradável. Talvez eu devesse olhar para esse chip em vez do iMX233. Eu estava me esforçando muito tentando colocar meus chips SDRAM ARM + dois em 4 camadas e o arquivei para trabalhar em outros projetos. Também sou usuário do Altium.
darron
O 9G20 e o iMX233 estão bem próximos. Eu escolhi o 9G20 porque o Ethernet MAC é embutido e os chips são um pouco mais baratos em baixa quantidade, mas o iMX233 era um corredor próximo.
pingswept
Além disso, dê uma olhada na Chumby Hacker Board - pode ser um bom lugar para começar, se você decidir construir um sistema em torno do iMX233. Os arquivos Altium estão nesta página da wiki: wiki.chumby.com/mediawiki/index.php/Chumby_hacker_board_beta
pingswept