¿Cuáles son los pasos reales, suponiendo que tuviera un conjunto de archivos de encabezado c que describieran los dispositivos mapeados en memoria en su sistema, para crear el kernel en ejecución inicial? Sé que todo el mundo simplemente arranca desde un CD en vivo/unidad USB, etc., pero ¿cómo se hizo ese primer arranque?
EDITAR: Debo señalar que en realidad estoy hablando de dispositivos ARM, entiendo los conceptos básicos de la carga a través de BIOS en una máquina típica, pero digamos que estamos hablando de un dispositivo personalizado.
Respuesta1
¿Cómo se hizo ese primer arranque?
Crear (escribir y compilar cruzadamente) un programa de arranque no es tan desalentador como parece sugerir.
Debo señalar que en realidad estoy hablando de dispositivos ARM, entiendo los conceptos básicos de la carga a través de BIOS en una máquina típica, pero digamos que estamos hablando de un dispositivo personalizado.
El BIOS al que te refieres es esencialmente una convención de PC. (CP/M también tenía un BIOS, pero no estaba necesariamente en la memoria no volátil). Las CPU ARM normalmente no tienen ni usan un BIOS.
El procesador ARM típico que se utiliza hoy en día está integrado con periféricos en un único IC llamadoSoC, sistema en un chip. La memoria principal, por ejemplo DRAM, y el almacenamiento no volátil, por ejemplo, flash NAND, suelen ser externos al SoC para lograr la máxima flexibilidad de diseño. Pero normalmente hay una pequeña ROM (memoria de solo lectura) incorporada (quizás 128 KB) para inicializar los componentes mínimos del sistema para comenzar las operaciones de arranque. Un reinicio del procesador siempre provocará la ejecución de esta ROM de arranque. (Esta ROM es verdaderamente de solo lectura y no se puede modificar. El código está enmascarado en el silicio durante la fabricación del chip).
Cada proveedor de SoC tiene su propio método de arranque para cargar y ejecutar el sistema operativo. Algunos utilizan flejes de hardware leídos a través de pines GPIO para determinar el origen de la siguiente etapa de la secuencia de arranque. Otro proveedor puede utilizar una lista ordenada de memorias y dispositivos para buscar un programa de arranque. Otra técnica es pasar al firmware en NOR flash, que se puede ejecutar directamente (es decir, XIP, ejecutar en el lugar).
Uno de los problemas de arrancar un sistema que utiliza DRAM como memoria principal es la inicialización del hardware. El controlador de memoria DRAM debe inicializarse antes de poder cargar el código en la DRAM y ejecutarlo. Entonces, ¿dónde reside este código de inicialización, ya que no puede estar en la memoria principal?
Cada proveedor tiene su propia solución. Algunos requieren que los datos de configuración de la memoria se almacenen en una memoria no volátil para que pueda acceder la ROM de arranque. Algunos SoC tienen SRAM integrada (que no requiere inicialización como la DRAM) para ejecutar un pequeño programa de arranque. Algunos SoC utilizan flash NOR para mantener un programa de arranque XIP.
Una vez que el programa de arranque ha inicializado la DRAM, se puede utilizar la memoria principal para cargar la siguiente etapa del arranque. Podría ser una utilidad de arranque sofisticada como U-Boot o (si el programa de arranque es capaz) el kernel de Linux. Tenga en cuenta que puede haber varios programas o etapas de arranque que se hayan realizado entre el reinicio del procesador y la ejecución del sistema operativo.
Los requisitos para iniciar el kernel ARM de Linux se detallan en el siguiente documento:http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
Las versiones anteriores de Linux ARM usaban la lista ATAG para pasar información de configuración básica al kernel. Las versiones modernas proporcionan una configuración de placa completa utilizando un binario compilado de un árbol de dispositivos.
Obviamente, la pregunta de "¿cómo se hace un bootstrap?" No se puede responder sin algunas reservas.
Al igual que el BIOS de la PC, la ROM de arranque de los SoC es propietaria y no está publicada (a menos que firme un acuerdo de confidencialidad, en todo caso). Pero la mayoría de los demás códigos de arranque se publican bajo GPL o licencias similares y se pueden obtener fácilmente.
APÉNDICE
Como ahora mencionas que estás usando un Zynq 7000 (que usa un SoC Xilinx), Xilinx tiene un video tutorial sobreCómo crear una imagen de arranque de Linux.
Ese video confirma lo que ya he escrito:
1. El SoC Xilinx tiene una ROM de arranque integrada (que técnicamente es la primera etapa, pero a menudo se ignora o se describe como etapa cero).
2. Hay "pines de modo" para especificar la fuente del programa de arranque para la siguiente etapa.
3. La ROM de arranque carga un programa de arranque (que técnicamente es la segunda etapa, pero a menudo se describe como "primera") etapa), llamado FSBL, en la SRAM integrada. Este programa inicializa la DRAM y carga la siguiente etapa, U-Boot.
4. U-Boot se ejecuta desde DRAM y carga el kernel de Linux.
El vídeo demuestra que el código fuente de FSBL se puede descargar desde el sitio de Xilinx y realizar una compilación cruzada en unos pocos pasos. No hay"truco"como usted alega. La compilación es una configuración y compilación cruzada sencilla, que encuentro más simple/fácil que el paquete de aplicación típico.
Quizás su confusión se base en la ambigüedad del medio de arranque, es decir, no se han especificado las fuentes de las imágenes de arranque. El vídeo menciona la memoria flash NAND y la tarjeta SD como posibles dispositivos de arranque.
La ROM de arranque está dirigida a leer la imagen FSBL desde un medio de origen según lo configurado por los pines de modo.
El FSBL (si es como otros programas de arranque que he usado) está diseñado para leer U-Boot desde un medio fuente configurado. No existe una alternativa de tiempo de ejecución.
U-Boot intenta hacer honor a su nombre ("universal") y se puede configurar (usando variables de entorno) para cargar imágenes (y scripts) desde varios dispositivos. También existe la opción interactiva.
Consulte también la wiki de Xilinx enLinux, que declara que "la información completa sobre el arranque de Zynq se puede encontrar en elManual de referencia técnica".