¿Buenas herramientas o métodos para comprender la estructura del gestor de arranque?

Recientemente descubrí la causa de un error desagradable en el que he estado trabajando con un Atmel AT91SAM9G20 SBC que ejecuta U-boot , un gestor de arranque de código abierto. El núcleo del problema era que U-boot esperaba que el hardware se configurara de manera diferente a como lo había construido, por lo que algunos de los registros del dispositivo estaban mal configurados.

Ahora que he resuelto el problema, necesito ajustar U-boot para configurar los registros correctamente. Puedo hacer esto a ciegas agregando algunas líneas de código al final del programa, pero eso es complicado.

Esto me lleva a mi pregunta: ¿cómo puedo averiguar cómo funciona U-boot de manera más eficiente que comenzar en main() y leer todas las rutas de código posibles en todos los archivos? Intenté buscar en los archivos y mirar el código cerca de los identificadores relevantes. Esto ha resultado ineficaz; parece que la mayor parte del código son controladores para subsistemas que no me interesan. De hecho, entiendo bastante bien cómo funciona el cargador de arranque, pero espero que exista un método mejor que mi enfoque ingenuo.

¿Has intentado preguntar en la lista de correo de desarrolladores de uboot?

Respuestas (2)

Hay varias herramientas/estrategias que pueden ayudar:

  • Mejores herramientas para dar sentido al código fuente:

    • cscope es una herramienta para explorar código C, es como grep pero entiende la sintaxis
    • Llame a generadores de gráficos para dibujar una imagen de la estructura de llamada de función
    • Fenris se ve interesante aunque no lo he probado
  • Análisis de tiempo de ejecución

    • Recorra secciones interesantes con un depurador y analice lo que sucede
    • Use las funciones de instrumentación de gcc para llamar a una porción de bueno en la entrada/salida de cada función. p.ej. http://ndevilla.free.fr/etrace/
  • Escribiendo tu propio mini gestor de arranque

    • A menudo encuentro que la mejor manera de entender algo es recrearlo yo mismo

Desafortunadamente, no existe una receta mágica que funcione para todo.

@Runtime Analysis: no es tan viable en un sistema integrado separado, particularmente cuando no hay un sistema operativo subyacente ejecutándose al mismo tiempo, por ejemplo, un gestor de arranque, que es este.
Todavía puede recorrerlo paso a paso con un depurador como sugiere Joby. Dependiendo de la complejidad, puede ser útil o no.
Cscope es el tipo de cosa que estaba imaginando. Esperaba algo un poco más brillante, pero es un buen comienzo. Gracias.

¿Cómo lo configuró para construir para el AT91?

El árbol de código parece estar diseñado de tal manera que cualquier elemento específico de la arquitectura se encuentra en el árbol 'arch/(cpu class)/(cpu type)/...'. Encontré el código AT91 en arch/arm/cpu/arm926ejs/at91... ¿las cosas específicas de la variante que buscas modificar no se encuentran allí? No hay mucho que buscar en ese directorio, especialmente porque casi la mitad de los archivos son específicos de cada variante AT91.

Lo siento si esto es obvio... pero no mencionaste revisar esto.

Todavía no había mirado el árbol de códigos de uBoot, pero tu publicación me asustó para hacerlo. Uno de mis proyectos secundarios consiste en usar uBoot y Linux en una PCB iMX233 personalizada. Estoy muy interesado en recibir este tipo de comentarios sobre qué tan bien se aísla la arquitectura de uBoot y las cosas específicas de la variante y qué tan grande será el dolor.

Sí, pasé un buen rato con arch/arm/cpu/arm926ejs/at91/*, pero gracias por la sugerencia. Resultó que el código que estaba buscando estaba en realidad en la ROM de arranque del procesador, a la que solo puede acceder Atmel. Los detalles sangrientos están aquí: at91.com/forum/viewtopic.php/f,9/t,19732/start,0/st,0/sk,t/sd,a
Por cierto, en general, me ha impresionado bastante U-boot. Para la gran cantidad de placas y CPU que admite, está bastante bien organizado. La documentación es escasa, pero eso parece estar a la par del curso para los cargadores de arranque.
@pingswept: oye, Linux en 4 capas. Bonito. Tal vez debería buscar ese chip en lugar del iMX233. Estaba pasando un gran momento tratando de obtener mi ARM + dos chips SDRAM en 4 capas y lo dejé de lado para trabajar en otros proyectos. Yo también soy usuario de Altium.
El 9G20 y el iMX233 están bastante cerca. Elegí el 9G20 porque el Ethernet MAC está integrado y los chips son un poco más baratos en poca cantidad, pero el iMX233 quedó cerca.
Además, eche un vistazo a Chumby Hacker Board; podría ser un buen lugar para comenzar si decide construir un sistema alrededor del iMX233. Los archivos de Altium están en esta página wiki: wiki.chumby.com/mediawiki/index.php/Chumby_hacker_board_beta