¡Esta es una revisión vieja del documento!


Inicialización de un procesador. Caso Cortex-A8

Antes de comenzar con la descripción técnica de cada etapa de la inicialización del procesador es conveniente aclarar que se entiende por “inicializar el procesador” en el contexto ARM.

Se asume que el lector se encuentra familiarizado con el concepto de Microprocessor-based system on a chip, ya que este artículo tratará el caso del núcleo Cortex-A8 en el sistema Cortex A8 Test Chip y AM3357, los cuales a su vez se integran sobre las placas PB-A8 y Beagle Bone Black

La inicialización de una sistema dispone al menos de tres etapas

  1. Inicialización del SoC: Consiste en la configuración y establecimiento de un estado conocido de los registros y módulos críticos que puedan impedir la normal ejecución del código necesario para alcanzar la siguiente etapa. Entre los casos de uso mas frecuentes se puede mencionar:
    1. Registro de referencia ejecución de código (Program Counter, Instruction Pointer)
    2. Registros de modo de operación (CPSR)
    3. Registro de referencia de pila (Stack Pointer)
    4. Registros de propósito general
    5. Excepciones
    6. Interrupciones
    7. Procesadores secundarios
    8. Reloj interno
  2. Inicialización de la placa: En esta etapa se configuran los periféricos mínimos que permitan ejecutar el código necesario para alcanzar la siguiente etapa. Entre los más comunes se encuentra:
    1. Controladores de memorias externas (RAM, ROM). Principalmente para leer y “desempaquetar” el código de la siguiente etapa.
    2. Controlador de interrupciones
    3. Controladores de interfaces de comunicación. Usualmente (UART) para actuar como dispositivo de depuración.
    4. Controladores de vídeo. En algunos casos se requiere lo que se conoce como “Splash screen” para indicarle al usuario que el sistema se esta inicializando
    5. Controladores de interfaces de entrada/salida. Por lo general se emplean (GPIO) para señalizar el estado del sistema y/o realizar alguna acción alternativa ante un requerimiento del usuario (presion de algún botón)
  3. Inicialización del sistema operativo o programa principal: Durante la ejecución del código asociado a esta etapa el sistema se inicializa completamente alcanzando todas las funcionalidades para las cuales fue concebido. Esta etapa es la más compleja a nivel de descripción/asociación código hardware, pero se pueden mencionar las inicializaciones más relevantes:
    1. Paginación
    2. Reinicialización de excepciones. Se contemplan casos y acciones más complejas que permitan salvaguardar el sistema
    3. Kernel
    4. Root File System
    5. Reinicialización de interrupciones. Se contemplan interacciones más complejas con los periféricos inicializados en esta etapa
    6. Controladores de bus. (I2C, SPI, PCI)
    7. Ejecución de programa principal.

El presente artículo solo se enfocará en la primer etapa Inicialización del SoC

¿Dónde está mi código?

Una de las principales barreras que se tiene al momento de inicializar el procesador es donde almacenar el código para que pueda ser ejecutado y todo lo que ello implica (rangos de direcciones, memoria disponible, etc)

No existe una respuesta única ya que esto depende del SoC, es decir cada fabricante puede disponer de su propio método, por lo cual analizaremos los casos propuestos.

En base a la experiencia de quien escribe este articulo la comprensión acabada de la arquitectura interna del SoC es un tema que tiende a ser un agujero negro, ya que cuanto mejor se desee comprender mayor cantidad de interfaces/buses/estándares/protocolos (AXI, AHB, PLxxx, RNDIS, UTMI) se deben dominar, por lo que se brindará tan solo una visión a nivel programador

cortex a8 test chip

El mapa de memoria brinda entre otra la siguiente información:

Owner Address range Bus type Memory region size
Northbridge 0x00000000- 0x0FFFFFFF Dinamic Memory Controller 256MB (DDR mirror)
Northbridge 0x40000000- 0x5FFFFFFF Static Memory Controller 512MB
Northbridge 0x70000000- 0x8FFFFFFF Dinamic Memory Controller 512MB

De la tabla se desprende que la memoria RAM se direcciona en el rango 0x70000000-0x8FFFFFFF, y que la parte superior del mismo (256MB) se encuentra espejado en 0x00000000-0x0FFFFFFF. Sin embargo se debe recordar que al estar en la etapa Inicialización del SoC, el DMC no se encuentra configurado por lo que no es posible emplear dicha memoria y por ende cualquier rango asociado a la misma.

Por su parte la ROM se direcciona en el rango 0x40000000- 0x5FFFFFFF y el controlador de este tipo de memorias no requiere inicialización, justamente para poder leer el código que permita satisfacer los requerimientos de la etapa Inicialización del SoC. Al parecer ya se encuentra resuelto el dilema sobre donde leer el código, pero al lector astuto seguramente le surgirá interrogante ¿Cómo puede ser esto posible, si la Reset Vector Address es 0x00000000 o 0xFFFF0000?
Para resolver esta duda perfectamente válida apelamos a la “magia” del Northbridge, este ASIC específico de esta placa se encarga de remapear la NOR de 0x40000000- 0x40FFFFFF a 0x00000000-0x00FFFFFF. Si bien esto ya brinda cierta claridad sobre donde debe situarse el código, es importante observar que el rango remapeado es tan solo de 16MB, frente a los 512MB disponibles en el mapa de memoria, esto significa que si bien la placa puede disponer de una NOR de hasta 512MB el código de arranque en la misma solo puede estar alojado en los primeros 16MB, quedando el restante espacio para disponible para el código complementario. Esto es importante tenerlo presente al momento de generar el mapa de memoria del código por lo general mediante el linker script

AM 335x

En ambos casos el código de inicialización se encuentra en una memoria no volátil por lo cual si bien es posible ejecutarlo de la misma, es importante remarcar que no se dispone de pila a menos que la RAM externa sea inicializada o se utilice la SRAM interna (si esta disponible y accesible). Esto último suele ser una opción transitoria sobre todo para fines de depuración hasta disponer de DMC correctamente inicializado

ChristiaN 2023/04/19 17:10