¿Qué lenguaje de programación se usa para escribir un programa de BIOS?

65

Según tengo entendido, el código de BIOS / flujo de bits que se encuentra en la ROM debe ser genérico (funciona junto con múltiples tipos de CPU o ISA). Además, vi mencionado en la web que es posible volcar su código (y "desarmarlo").

Entonces, ¿en qué idioma, conjunto de instrucciones o código de máquina está escrito? ¿No necesita ningún tipo de procesador para realizar sus operaciones? Si es así, supongo que usará la CPU externa, entonces, ¿cómo sabe el conjunto de instrucciones específicas de la empleada?

Tal vez tiene un procesador interno?

Reflexión
fuente
99
posible duplicado de ¿Cómo funcionan las computadoras?
mosquito
39
La publicación cruzada es bastante mala, pero cuando termina en las Preguntas de la Red Caliente en ambas versiones , eso está más allá del límite ...
Mason Wheeler
8
"El código de BIOS / flujo de bits que se encuentra en la ROM debe ser genérico (funciona junto con múltiples tipos de CPU o ISA)". - Nunca escuché de un BIOS que funcione con múltiples ISA. ¿Tienes un ejemplo?
chx
66
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Yo diría "No, todo lo contrario"
edc65
11
Esto ni siquiera es remotamente un duplicado de una pregunta tan general como "¿Cómo funcionan las computadoras?". Por favor no cierre como engañado.
Andres F.

Respuestas:

103

Los BIOS solían escribirse exclusivamente en lenguaje ensamblador, pero la transición se realizó hace mucho tiempo para escribir la mayoría del código en un lenguaje de nivel superior y dejarlo escrito en ensamblado con la menor cantidad de partes posible, preferiblemente solo el programa de arranque, (los primeros cientos de instrucciones a las que salta la CPU después de un inicio / reinicio) y cualquier rutina que trate con peculiaridades específicas de la arquitectura subyacente.

Las BIOS ya se escribían principalmente en C a principios de los noventa. (Escribí un BIOS en 90% C, 10% de ensamblaje a principios de los noventa).

Lo que también ha ayudado mucho en esta dirección es:

  • Las bibliotecas C que se dirigen a una arquitectura específica e incluyen funciones para tratar las peculiaridades de esa arquitectura, por ejemplo, funciones para leer / escribir bytes a / desde puertos de E / S de la arquitectura x86. Microsoft C siempre ha ofrecido funciones de biblioteca para ese tipo de cosas.

  • Los compiladores de C que no solo se dirigen a una arquitectura de CPU específica, sino que incluso ofrecen extensiones al lenguaje C que puede usar para escribir código que hace uso de características especiales de la CPU. Por ejemplo, la arquitectura x86 admite cosas conocidas como interrupciones, que invocan rutinas conocidas como manejadores de interrupciones, y requiere que tengan secuencias especiales de instrucciones de entrada / salida. Desde los primeros días, Microsoft C admitía palabras clave especiales que podía usar para marcar una función como controlador de interrupciones, por lo que podía ser invocada directamente por una interrupción de la CPU, por lo que no tenía que escribir ningún ensamblado para ella.

Hoy en día supongo que la mayor parte del BIOS está escrito en C ++, si no en un lenguaje de nivel superior.

La gran mayoría del código que forma un BIOS es específico del hardware subyacente, por lo que no necesita ser portátil: se garantiza que siempre se ejecutará en el mismo tipo de CPU. La CPU puede evolucionar, pero mientras mantenga la compatibilidad con versiones anteriores, aún puede ejecutar el BIOS sin modificaciones. Además, siempre puede recompilar las partes del BIOS escritas en C para que se ejecuten de forma nativa en cualquier CPU nueva que surja, si surge la necesidad.

La razón por la que escribimos BIOS en idiomas de un nivel superior al ensamblado es porque es más fácil escribirlos de esta manera, no porque realmente necesiten ser portátiles.

Mike Nakis
fuente
77
Si. A veces, incluso puede tener una placa base vinculada no solo a una arquitectura de CPU específica, sino incluso a un proveedor de CPU específico. Hoy en día puede comprar una placa base x86 que solo es compatible con las CPU Intel x86, o una placa base x86 que solo es compatible con las CPU AMD x86. El BIOS en estas placas base será idéntico en gran medida, porque en ambos casos la CPU comprende el conjunto de instrucciones x86, y la mayoría de los periféricos son idénticos, pero algunos periféricos tienen diferencias que el BIOS debe tener en cuenta.
Mike Nakis
44
@Reflection observa de cerca cómo se ve físicamente una placa base. El zócalo de la CPU tendrá una determinada disposición de pines, que es específica de la familia de CPU que acepta. No puede conectarse físicamente, por ejemplo, un Intel P4 a una placa base AMD Opteron
Caleth
14
El término "BIOS" se refiere al "Sistema básico de entrada / salida" de una PC, por lo que tener un BIOS implica una CPU x86. Los sistemas IA64 tienen un EFI en lugar de un BIOS, los sistemas PowerPC pueden tener un sistema Open Firmware o uno patentado, los sistemas Sparc también tienen OFW (o más bien OpenBoot), el OLPC X0 es un sistema basado en x86 que usa OFW. Incluso las PC ya no usan BIOS, han cambiado a (U) EFI. OB / OFW es interesante, porque está diseñado no solo para ser portátil sino también multiplataforma. Los controladores OFW funcionarán en cualquier sistema OFW, son "Write Once Run Anywhere", independientemente de la CPU ISA.
Jörg W Mittag
14
"Hoy en día supondría que la mayor parte del BIOS está escrito en C ++" No necesariamente supondría eso, podría ser cierto, pero trabajo en esa industria y ciertamente muchos cargadores de arranque están escritos en letra C. Las personas que escriben ese tipo de cosas a menudo son la "Vieja Guardia" y tienden a no confiar aún completamente en C ++.
Sam
66
@TomDworzanski: Aunque técnicamente no es BIOS (que se refiere exclusivamente a las viejas cosas de PC de 1981), muchas implementaciones de IEEE-1275 Open Firmware (que se utiliza para un papel similar al BIOS en Sparc, la plataforma de referencia de hardware común PowerPC (por ejemplo, PowerMac, PowerBook), la laptop OLPC X0-1 de 100 $) están escritos en parte en lenguajes distintos al ensamblado / C. OpenBoot , Open Firmware , OpenBIOS todos contienen ...
Jörg W Mittag
11

Si bien, en teoría, se puede escribir BIOS en cualquier lenguaje, la realidad moderna es que la mayoría de los BIOS se escriben usando ensamblado, C o una combinación de ambos .

El BIOS debe estar escrito en un lenguaje que pueda compilar el código de la máquina , que es entendido por la máquina física del hardware. Esto elimina los lenguajes interpretados directa o intermediamente (Perl, Python, PHP, Ruby, Java, C #, JavaScript, etc.) como apropiados para escribir BIOS. (Aunque, en teoría, uno podría implementar uno de estos lenguajes para compilar directamente en código de máquina estático o podría incrustar de alguna manera el intérprete en BIOS. Existe, por ejemplo, el proyecto abandonware GCJ para Java).

La mayoría de los OEM implementan un BIOS extendiendo implementaciones de BIOS genéricas y patentadas por compañías como American Megatrends y Phoenix Techologies . (Probablemente ya haya visto una de esas compañías en la primera pantalla de arranque de una computadora). El código fuente de estas implementaciones no está disponible públicamente, pero parte de él se ha filtrado. No quiero vincular esto directamente con el código fuente de C y ensamblado, pero hay lugares en Internet donde se discute este código fuente para aquellos que desean echar un vistazo.

Algunos fabricantes de hardware, como los que se dirigen a los mercados de alto rendimiento y juegos, saturan sus implementaciones de BIOS con características de personalización, estadísticas e interfaces de usuario atractivas diseñadas para sus implementaciones exactas. Muchas de estas características van más allá de lo que se ofrece en los productos genéricos producidos por American Megatrends y otros. Desafortunadamente, estas compañías a menudo ven el lanzamiento de su código fuente como un riesgo de seguridad , por lo que se sabe muy poco acerca de estas implementaciones de gama alta porque se comparte poco sobre ellas. Por supuesto, uno podría encontrar formas de acceder y descompilar dichas implementaciones de BIOS, pero hacerlo puede ser difícil y posiblemente ilegal.

Volviendo a la pregunta original, debido a la necesidad de producir código máquina nativo, un BIOS tendría que implementarse en un lenguaje de programación compatible con un compilador de código máquina nativo . Si bien existen muchos lenguajes de este tipo y, aunque estoy seguro de que en las últimas décadas, se han utilizado varios lenguajes en la experimentación, cada implementación de BIOS abierta que he podido encontrar se basa específicamente en una combinación de C y / o ensamblaje. Las implementaciones de BIOS de código abierto que miré para llegar a esta conclusión incluyen OpenBIOS , tinyBIOS , coreboot , Intel BIOS y Libreboot. También miré algunas implementaciones de BIOS muy antiguas que no son relevantes hoy en día, pero también seguí la regla C y / o de ensamblaje.

Creo que también es relevante mirar otro software creado para interactuar directamente con el hardware. Sabemos, por ejemplo, que el kernel de Linux , el kernel de OS X y el kernel de Windows son principalmente C con algunos ensamblados y algunos lenguajes de nivel superior para tareas específicas. También sabemos que los controladores de hardware en Linux y los controladores de hardware en Windows están escritos principalmente en C.

Volviendo al BIOS, creo que también es importante tener en cuenta la economía del lenguaje de programación elegido. El BIOS generalmente se escribe como una necesidad para complementar las ventas de hardware. Se sabe que los sistemas BIOS modernos se escriben principalmente en C y / o ensamblado. Un cambio a otra herramienta agregaría costos significativos a lo que generalmente se consideran productos básicos que podrían afectar negativamente las ventas. Sin entrar en Economía 101, puedo asegurarle que probablemente no valga la pena que un OEM se desvíe de las herramientas probadas y verdaderas que se han demostrado durante décadas.

Por supuesto, hay y habrá proyectos de aficionados para escribir BIOS también. Estos también, hasta ahora, parecen estar eligiendo C y / o ensamblaje. Quizás algún día se utilizarán otras tecnologías. Pero hoy, la elección de está bien definida.

Rico smith
fuente
44
Es un poco complicado, pero C # y Java no se interpretan. Se compilan en código de bytes. Es el código de bytes que luego maneja un intérprete. No cambia la lógica del primer párrafo.
Tonny
1
@Tonny Eso es correcto. Agregué "interpretado directa o intermediamente" para ser un poco más claro.
@Tonny normalmente es un jitter en lugar de un intérprete, lo cual es una distinción importante porque es posible pre-jit todo a nativo siempre que no se utilicen ciertas técnicas dinámicas. Como tal, sería teóricamente posible escribir un BIOS en lenguajes .NET o Java, si uno hiciera ambas cosas y se asegurara de que todo el soporte de tiempo de ejecución necesario estuviera disponible. Sin embargo, me imagino que los esfuerzos para hacerlo serían más que enanos de cualquier conveniencia encontrada.
Jon Hanna
1
@Tonny En realidad, C # compila el código nativo msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx, por lo que es extraño verlo en la lista de lenguajes débiles / dinámicos.
Den
@Den C # generalmente no se compila en código nativo. Este producto nativo de .Net al que enlaza aún no se ha lanzado oficialmente. Por lo que he leído, compilará el código de la aplicación y el código marco requerido en un ejecutable. De acuerdo con las preguntas frecuentes, esto estará dirigido inicialmente a las aplicaciones de la Tienda Windows, por lo que puede llevar algún tiempo que esto sea más compatible. Dicho todo esto, parece que Microsoft puede alejarse del modelo de máquina virtual en algún momento en el futuro si todo va bien.
4

El BIOS real para una computadora se escribiría en algún lenguaje (probablemente C o ensamblado) que se compila en código binario dependiente de la arquitectura; este código no puede ejecutarse en ninguna otra arquitectura (y posiblemente no sea necesario, ya que es muy específico para la máquina con la que se envía).

¿Pero posiblemente está pensando en las ROM de opción (que a veces se llaman BIOS, como en "Video BIOS" para una ROM de opción de GPU)?

Para las ROM opcionales compatibles con BIOS heredadas, probablemente serían código ejecutable dependiente de ISA (nuevamente generado por cualquier lenguaje que pueda compilarse para apuntar a la arquitectura deseada); PCI también permite incluir código para múltiples ISA y permite que el host seleccione la imagen binaria apropiada durante el proceso de arranque.

Para las ROM opcionales compatibles con UEFI, también hay un formato de código de bytes independiente de la arquitectura que se puede ejecutar en diferentes arquitecturas, pero también se puede usar el código dependiente de ISA.

lxgr
fuente