<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>C on KnightLi Blog</title>
        <link>https://www.knightli.com/es/tags/c/</link>
        <description>Recent content in C on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Thu, 30 Apr 2026 19:53:08 +0800</lastBuildDate><atom:link href="https://www.knightli.com/es/tags/c/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Primeros pasos con la compilación de programas UEFI: desde uefi-simple hasta su primer .EFI</title>
        <link>https://www.knightli.com/es/2026/04/30/compile-uefi-program-beginner-guide/</link>
        <pubDate>Thu, 30 Apr 2026 19:53:08 +0800</pubDate>
        
        <guid>https://www.knightli.com/es/2026/04/30/compile-uefi-program-beginner-guide/</guid>
        <description>&lt;p&gt;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 &lt;code&gt;.EFI&lt;/code&gt; no tiene la misma experiencia directa de edición y ejecución que una aplicación de escritorio normal.&lt;/p&gt;
&lt;p&gt;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?&lt;/p&gt;
&lt;h2 id=&#34;qué-es-un-programa-uefi&#34;&gt;¿Qué es un programa UEFI?
&lt;/h2&gt;&lt;p&gt;Un programa UEFI suele ser un archivo &lt;code&gt;.EFI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No es un &lt;code&gt;.exe&lt;/code&gt; 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestores de arranque&lt;/li&gt;
&lt;li&gt;Herramientas de inicialización de hardware.&lt;/li&gt;
&lt;li&gt;Herramientas de actualización de firmware&lt;/li&gt;
&lt;li&gt;Herramientas de diagnóstico previas al arranque&lt;/li&gt;
&lt;li&gt;Flujos de arranque personalizados&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Muchas funciones que ve al principio del proceso de inicio del sistema pueden estar relacionadas con aplicaciones, controladores o servicios de firmware UEFI.&lt;/p&gt;
&lt;p&gt;Para los principiantes, no es necesario comprender inmediatamente el desarrollo completo del firmware. El primer objetivo es simple: compilar un archivo &lt;code&gt;.EFI&lt;/code&gt; que pueda cargarse mediante un UEFI Shell o un emulador.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-no-empezar-con-edk-ii&#34;&gt;¿Por qué no empezar con EDK II?
&lt;/h2&gt;&lt;p&gt;El desarrollo real de UEFI a menudo implica EDK II.&lt;/p&gt;
&lt;p&gt;EDK II es completo y más cercano a la ingeniería de firmware real, pero no es muy amigable para principiantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La estructura del proyecto es compleja.&lt;/li&gt;
&lt;li&gt;El sistema de construcción tiene una curva de aprendizaje.&lt;/li&gt;
&lt;li&gt;Las variables de entorno y la configuración de la cadena de herramientas implican muchos detalles.&lt;/li&gt;
&lt;li&gt;Los errores del compilador no siempre son fáciles de entender.&lt;/li&gt;
&lt;li&gt;Es fácil quedarse atascado en el entorno antes de escribir cualquier código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si el objetivo es simplemente ejecutar un programa UEFI mínimo, un ejemplo ligero es un mejor punto de partida.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt; es uno de esos proyectos. Su objetivo es sencillo: proporcionar un ejemplo UEFI Hello World sencillo para que puedas compilar un archivo &lt;code&gt;.EFI&lt;/code&gt; primero.&lt;/p&gt;
&lt;h2 id=&#34;para-qué-sirve-uefi-simple&#34;&gt;¿Para qué sirve &lt;code&gt;uefi-simple&lt;/code&gt;?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;uefi-simple&lt;/code&gt; es un buen primer paso para los principiantes en UEFI.&lt;/p&gt;
&lt;p&gt;Resuelve tres problemas prácticos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le brinda una estructura de aplicación UEFI mínima y compilable.&lt;/li&gt;
&lt;li&gt;Evita la complejidad de grandes proyectos de firmware al principio&lt;/li&gt;
&lt;li&gt;Le permite verificar que compilar, vincular y ejecutar todo funciona.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id=&#34;qué-preparar-antes-de-comenzar&#34;&gt;Qué preparar antes de comenzar
&lt;/h2&gt;&lt;p&gt;Necesita al menos algunas categorías de herramientas.&lt;/p&gt;
&lt;p&gt;La primera categoría es la cadena de herramientas del compilador.&lt;/p&gt;
&lt;p&gt;En Windows, puedes comenzar con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estudio Visual 2022&lt;/li&gt;
&lt;li&gt;O MinGW/gcc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La segunda categoría es un entorno de ejecución UEFI.&lt;/p&gt;
&lt;p&gt;Hay dos opciones comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ejecute el archivo &lt;code&gt;.EFI&lt;/code&gt; en UEFI Shell de una máquina real&lt;/li&gt;
&lt;li&gt;Pruébalo en un entorno virtual con QEMU + OVMF&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La tercera categoría es un proyecto de ejemplo.&lt;/p&gt;
&lt;p&gt;Los principiantes no deberían empezar escribiendo scripts de compilación desde un directorio vacío. Usar un ejemplo mínimo como &lt;code&gt;uefi-simple&lt;/code&gt; ayuda a evitar muchos problemas del sistema de compilación.&lt;/p&gt;
&lt;h2 id=&#34;flujo-de-trabajo-básico&#34;&gt;Flujo de trabajo básico
&lt;/h2&gt;&lt;p&gt;Un flujo de trabajo mínimo de un programa UEFI se puede entender así.&lt;/p&gt;
&lt;p&gt;Primero, obtenga el proyecto de ejemplo.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pbatard&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;uefi-simple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;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.&lt;br&gt;
Si usa MinGW/gcc, siga el Makefile o las instrucciones proporcionadas por el proyecto.&lt;/p&gt;
&lt;p&gt;En tercer lugar, genere el archivo &lt;code&gt;.EFI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El punto clave aquí es confirmar la arquitectura de destino. Una PC común suele ser &lt;code&gt;x86_64&lt;/code&gt;, es decir, un entorno UEFI de 64 bits.&lt;/p&gt;
&lt;p&gt;Cuarto, coloque el archivo &lt;code&gt;.EFI&lt;/code&gt; en algún lugar al que pueda acceder UEFI Shell.&lt;/p&gt;
&lt;p&gt;En una máquina real, esto normalmente significa preparar una partición FAT32 o una unidad USB.&lt;br&gt;
Con QEMU, puede montar un directorio o una imagen de disco.&lt;/p&gt;
&lt;p&gt;Quinto, ejecútelo en UEFI Shell.&lt;/p&gt;
&lt;p&gt;El resultado suele ser un resultado mínimo, como un mensaje estilo Hola mundo.&lt;/p&gt;
&lt;h2 id=&#34;donde-los-principiantes-suelen-quedarse-estancados&#34;&gt;Donde los principiantes suelen quedarse estancados
&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Los problemas comunes incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arquitectura de compilador incorrecta&lt;/li&gt;
&lt;li&gt;Formato de destino incorrecto&lt;/li&gt;
&lt;li&gt;Parámetros del enlazador incompletos&lt;/li&gt;
&lt;li&gt;Falta el punto de entrada UEFI&lt;/li&gt;
&lt;li&gt;Generar un ejecutable ordinario en lugar de un &lt;code&gt;.EFI&lt;/code&gt; cargable por UEFI&lt;/li&gt;
&lt;li&gt;QEMU u OVMF no configurados correctamente&lt;/li&gt;
&lt;li&gt;Arranque seguro en una máquina real que bloquea un programa no firmado&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los errores del vinculador son especialmente fáciles de malinterpretar como problemas de código.&lt;br&gt;
En muchos casos, el verdadero problema es la función de entrada, el subsistema, la arquitectura de destino o el script del vinculador.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-utilizar-qemu--ovmf-para-realizar-pruebas&#34;&gt;¿Por qué utilizar QEMU + OVMF para realizar pruebas?
&lt;/h2&gt;&lt;p&gt;Es posible probar programas UEFI en una máquina real, pero no es conveniente en la etapa principiante.&lt;/p&gt;
&lt;p&gt;Es posible que tengas que repetir este ciclo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compilar&lt;/li&gt;
&lt;li&gt;Copiar a una unidad USB&lt;/li&gt;
&lt;li&gt;Reiniciar&lt;/li&gt;
&lt;li&gt;Ingrese al UEFI Shell&lt;/li&gt;
&lt;li&gt;Ejecutar el programa&lt;/li&gt;
&lt;li&gt;Registra el error&lt;/li&gt;
&lt;li&gt;Regresar al sistema y modificar el código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ese bucle es lento.&lt;/p&gt;
&lt;p&gt;QEMU + OVMF le permite simular un entorno UEFI directamente dentro del sistema operativo. Puede verificar si un archivo &lt;code&gt;.EFI&lt;/code&gt; se carga más rápidamente y es menos probable que afecte sus entradas de arranque reales.&lt;/p&gt;
&lt;p&gt;Una vez que el programa funciona básicamente, probarlo en una máquina real es mucho más manejable.&lt;/p&gt;
&lt;h2 id=&#34;qué-deberían-modificar-primero-los-principiantes&#34;&gt;¿Qué deberían modificar primero los principiantes?
&lt;/h2&gt;&lt;p&gt;Si ya ha compilado su primer &lt;code&gt;.EFI&lt;/code&gt; con el proyecto de ejemplo, no salte a funciones complejas de inmediato.&lt;/p&gt;
&lt;p&gt;Un mejor orden es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cambie primero el texto de salida para confirmar que la recompilación realmente surte efecto.&lt;/li&gt;
&lt;li&gt;Intente leer información sencilla proporcionada por UEFI.&lt;/li&gt;
&lt;li&gt;Comprender la función de entrada, protocolo de salida y servicios básicos.&lt;/li&gt;
&lt;li&gt;Luego considere funciones más complejas, como sistemas de archivos, salida gráfica o administración de entradas de arranque.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este enfoque hace que cada paso sea verificable.&lt;br&gt;
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.&lt;/p&gt;
&lt;h2 id=&#34;en-qué-se-diferencia-de-un-programa-c-normal&#34;&gt;¿En qué se diferencia de un programa C normal?
&lt;/h2&gt;&lt;p&gt;Aunque los programas UEFI se pueden escribir en C, su entorno de ejecución es completamente diferente al de los programas C normales.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La función de entrada es diferente.&lt;/li&gt;
&lt;li&gt;La salida funciona de manera diferente&lt;/li&gt;
&lt;li&gt;Las bibliotecas disponibles son diferentes.&lt;/li&gt;
&lt;li&gt;El acceso a la memoria y a los archivos funciona de forma diferente&lt;/li&gt;
&lt;li&gt;La depuración funciona de manera diferente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es por esto que partir de un ejemplo mínimo es mejor que escribir código como si fuera un programa C normal.&lt;/p&gt;
&lt;h2 id=&#34;un-camino-de-aprendizaje-práctico&#34;&gt;Un camino de aprendizaje práctico
&lt;/h2&gt;&lt;p&gt;Para principiantes, un camino realista es el siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paso 1: compilar &lt;code&gt;uefi-simple&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paso 2: Ejecútelo con QEMU + OVMF&lt;/li&gt;
&lt;li&gt;Paso 3: Modificar la salida de Hola Mundo&lt;/li&gt;
&lt;li&gt;Paso 4: Comprenda cómo UEFI Shell carga &lt;code&gt;.EFI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paso 5: aprenda la función de entrada UEFI y el protocolo de salida básico&lt;/li&gt;
&lt;li&gt;Paso 6: Luego lea EDK II o material de desarrollo UEFI más completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El objetivo de este camino es construir primero un circuito de retroalimentación que funcione.&lt;/p&gt;
&lt;p&gt;Una vez que pueda generar un &lt;code&gt;.EFI&lt;/code&gt; desde la fuente y ver el resultado en un entorno UEFI, ya habrá cruzado el primer umbral más difícil.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;p&gt;-&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Zhihu: material de compilación del programa UEFI] (&lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/643704056&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://zhuanlan.zhihu.com/p/643704056&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pensamiento-final&#34;&gt;Pensamiento final
&lt;/h2&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;No se apresure a utilizar funciones complejas.&lt;br&gt;
Comience con un ejemplo mínimo como &amp;ldquo;uefi-simple&amp;rdquo;, obtenga primero un &amp;ldquo;.EFI&amp;rdquo; ejecutable y luego comprenda gradualmente los puntos de entrada, protocolos y métodos de compilación de UEFI.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
