Primeros pasos con la compilación de programas UEFI: desde uefi-simple hasta su primer .EFI

Una guía para principiantes para compilar su primer programa UEFI .EFI: qué es un programa UEFI, por qué uefi-simple es un buen punto de partida, qué herramientas preparar y dónde suelen quedarse atascados los principiantes.

Compilar su primer programa UEFI no es precisamente sencillo. La configuración del entorno puede llevar tiempo, los errores del vinculador son comunes y un programa .EFI no tiene la misma experiencia directa de edición y ejecución que una aplicación de escritorio normal.

Este artículo organiza el tema desde la perspectiva de un principiante: si sólo desea compilar su primer programa UEFI, ¿por dónde debería empezar, qué conceptos importan primero y qué errores es más probable que aparezcan?

¿Qué es un programa UEFI?

Un programa UEFI suele ser un archivo .EFI.

No es un .exe ordinario en el que se hace doble clic en Windows. Es un ejecutable PE/COFF que se ejecuta dentro del entorno de firmware UEFI. Los casos de uso comunes incluyen:

  • Gestores de arranque
  • Herramientas de inicialización de hardware.
  • Herramientas de actualización de firmware
  • Herramientas de diagnóstico previas al arranque
  • Flujos de arranque personalizados

Muchas funciones que ve al principio del proceso de inicio del sistema pueden estar relacionadas con aplicaciones, controladores o servicios de firmware UEFI.

Para los principiantes, no es necesario comprender inmediatamente el desarrollo completo del firmware. El primer objetivo es simple: compilar un archivo .EFI que pueda cargarse mediante un UEFI Shell o un emulador.

¿Por qué no empezar con EDK II?

El desarrollo real de UEFI a menudo implica EDK II.

EDK II es completo y más cercano a la ingeniería de firmware real, pero no es muy amigable para principiantes:

  • La estructura del proyecto es compleja.
  • El sistema de construcción tiene una curva de aprendizaje.
  • Las variables de entorno y la configuración de la cadena de herramientas implican muchos detalles.
  • Los errores del compilador no siempre son fáciles de entender.
  • Es fácil quedarse atascado en el entorno antes de escribir cualquier código.

Si el objetivo es simplemente ejecutar un programa UEFI mínimo, un ejemplo ligero es un mejor punto de partida.

pbatard/uefi-simple es uno de esos proyectos. Su objetivo es sencillo: proporcionar un ejemplo UEFI Hello World sencillo para que puedas compilar un archivo .EFI primero.

¿Para qué sirve uefi-simple?

uefi-simple es un buen primer paso para los principiantes en UEFI.

Resuelve tres problemas prácticos:

  • Le brinda una estructura de aplicación UEFI mínima y compilable.
  • Evita la complejidad de grandes proyectos de firmware al principio
  • Le permite verificar que compilar, vincular y ejecutar todo funciona.

El proyecto admite múltiples métodos de compilación, incluidos Visual Studio 2022 y MinGW/gcc. También se puede probar con QEMU y OVMF.

En otras palabras, no es necesario reiniciar repetidamente una máquina real para los primeros experimentos. Ejecutar primero el programa en un emulador es mucho más seguro.

Qué preparar antes de comenzar

Necesita al menos algunas categorías de herramientas.

La primera categoría es la cadena de herramientas del compilador.

En Windows, puedes comenzar con:

  • Estudio Visual 2022
  • O MinGW/gcc

La segunda categoría es un entorno de ejecución UEFI.

Hay dos opciones comunes:

  • Ejecute el archivo .EFI en UEFI Shell de una máquina real
  • Pruébalo en un entorno virtual con QEMU + OVMF

La tercera categoría es un proyecto de ejemplo.

Los principiantes no deberían empezar escribiendo scripts de compilación desde un directorio vacío. Usar un ejemplo mínimo como uefi-simple ayuda a evitar muchos problemas del sistema de compilación.

Flujo de trabajo básico

Un flujo de trabajo mínimo de un programa UEFI se puede entender así.

Primero, obtenga el proyecto de ejemplo.

1
git clone https://github.com/pbatard/uefi-simple.git

En segundo lugar, elija una cadena de herramientas de compilación. Si usa Visual Studio, cree con la solución Visual Studio en el proyecto.
Si usa MinGW/gcc, siga el Makefile o las instrucciones proporcionadas por el proyecto.

En tercer lugar, genere el archivo .EFI.

El punto clave aquí es confirmar la arquitectura de destino. Una PC común suele ser x86_64, es decir, un entorno UEFI de 64 bits.

Cuarto, coloque el archivo .EFI en algún lugar al que pueda acceder UEFI Shell.

En una máquina real, esto normalmente significa preparar una partición FAT32 o una unidad USB.
Con QEMU, puede montar un directorio o una imagen de disco.

Quinto, ejecútelo en UEFI Shell.

El resultado suele ser un resultado mínimo, como un mensaje estilo Hola mundo.

Donde los principiantes suelen quedarse estancados

La parte más difícil de compilar un programa UEFI no suele ser el lenguaje C en sí, sino el entorno y el proceso de vinculación.

Los problemas comunes incluyen:

  • Arquitectura de compilador incorrecta
  • Formato de destino incorrecto
  • Parámetros del enlazador incompletos
  • Falta el punto de entrada UEFI
  • Generar un ejecutable ordinario en lugar de un .EFI cargable por UEFI
  • QEMU u OVMF no configurados correctamente
  • Arranque seguro en una máquina real que bloquea un programa no firmado

Los errores del vinculador son especialmente fáciles de malinterpretar como problemas de código.
En muchos casos, el verdadero problema es la función de entrada, el subsistema, la arquitectura de destino o el script del vinculador.

Entonces, en la primera etapa, no se apresure a entrar en una lógica compleja. Asegúrese de que el ejemplo original se pueda compilar y ejecutar, luego cambie la salida poco a poco.

¿Por qué utilizar QEMU + OVMF para realizar pruebas?

Es posible probar programas UEFI en una máquina real, pero no es conveniente en la etapa principiante.

Es posible que tengas que repetir este ciclo:

  • compilar
  • Copiar a una unidad USB
  • Reiniciar
  • Ingrese al UEFI Shell
  • Ejecutar el programa
  • Registra el error
  • Regresar al sistema y modificar el código.

Ese bucle es lento.

QEMU + OVMF le permite simular un entorno UEFI directamente dentro del sistema operativo. Puede verificar si un archivo .EFI se carga más rápidamente y es menos probable que afecte sus entradas de arranque reales.

Una vez que el programa funciona básicamente, probarlo en una máquina real es mucho más manejable.

¿Qué deberían modificar primero los principiantes?

Si ya ha compilado su primer .EFI con el proyecto de ejemplo, no salte a funciones complejas de inmediato.

Un mejor orden es:

  1. Cambie primero el texto de salida para confirmar que la recompilación realmente surte efecto.
  2. Intente leer información sencilla proporcionada por UEFI.
  3. Comprender la función de entrada, protocolo de salida y servicios básicos.
  4. Luego considere funciones más complejas, como sistemas de archivos, salida gráfica o administración de entradas de arranque.

Este enfoque hace que cada paso sea verificable.
Si cambia demasiado a la vez, resulta difícil saber si el problema está en el código, el proceso de compilación o el entorno de ejecución.

¿En qué se diferencia de un programa C normal?

Aunque los programas UEFI se pueden escribir en C, su entorno de ejecución es completamente diferente al de los programas C normales.

Un programa C normal normalmente se ejecuta dentro de un sistema operativo y puede depender de la biblioteca, el sistema de archivos, el modelo de proceso y las llamadas al sistema estándar.

Un programa UEFI se ejecuta antes de que se inicie el sistema operativo. Se basa en los servicios proporcionados por el firmware UEFI. Muchas cosas a las que está acostumbrado en los programas normales no están disponibles aquí automáticamente. Al escribir programas UEFI, es necesario adaptarse a varias diferencias:

  • La función de entrada es diferente.
  • La salida funciona de manera diferente
  • Las bibliotecas disponibles son diferentes.
  • El acceso a la memoria y a los archivos funciona de forma diferente
  • La depuración funciona de manera diferente

Es por esto que partir de un ejemplo mínimo es mejor que escribir código como si fuera un programa C normal.

Un camino de aprendizaje práctico

Para principiantes, un camino realista es el siguiente:

  • Paso 1: compilar uefi-simple
  • Paso 2: Ejecútelo con QEMU + OVMF
  • Paso 3: Modificar la salida de Hola Mundo
  • Paso 4: Comprenda cómo UEFI Shell carga .EFI
  • Paso 5: aprenda la función de entrada UEFI y el protocolo de salida básico
  • Paso 6: Luego lea EDK II o material de desarrollo UEFI más completo

El objetivo de este camino es construir primero un circuito de retroalimentación que funcione.

Una vez que pueda generar un .EFI desde la fuente y ver el resultado en un entorno UEFI, ya habrá cruzado el primer umbral más difícil.

Referencias

-pbatard/uefi-simple

Pensamiento final

La parte difícil de compilar su primer programa UEFI generalmente no es escribir un poco de código C, sino conectar la cadena de herramientas, el formato de enlace y el entorno de ejecución.

No se apresure a utilizar funciones complejas.
Comience con un ejemplo mínimo como “uefi-simple”, obtenga primero un “.EFI” ejecutable y luego comprenda gradualmente los puntos de entrada, protocolos y métodos de compilación de UEFI.

记录并分享
Creado con Hugo
Tema Stack diseñado por Jimmy