¿Por qué se necesita una especificación de formato binario para los archivos ejecutables?

¿Por qué se necesita una especificación de formato binario para los archivos ejecutables?

Entiendo que un sistema operativo como Linux o Windows está escrito en C/C++ y compilado en una arquitectura determinada (por ejemplo, AMD64) para producir un código de máquina adecuado para esa arquitectura.

Mis preguntas -

  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa el formato ejecutable portátil?
  2. ¿Se puede crear un sistema operativo y un programa que se ejecuta en ese sistema operativo sin esta especificación de formato binario?
  3. ¿El formato binario depende de la arquitectura, del sistema operativo o de ambos?
  4. ¿El formato binario es aplicable sólo a archivos ejecutables o también es aplicable al código del sistema operativo?

Respuesta1

Como habrás adivinado, los formatos ejecutables contienen algo más que código de máquina. Por ejemplo, pueden:

  • Especifique metadatos para el sistema operativo, por ejemplo, a qué arquitectura está destinado el ejecutable. Estos metadatos comprendenencabezamientodel archivo.

  • Especificar el programadisposiciónen memoria. En los sistemas operativos modernos, la mayoría de los archivos ejecutables no se cargan en la memoria en un solo fragmento; por lo general, tienen muchos archivos separados.regiones/secciones/segmentos. Algunos de estos segmentos contendrán código ejecutable. Algunos de ellos contendrán datos inmutables, como cadenas de texto. Algunos de ellos serán designados como memoria grabable para el montón de programas.

    Los diferentes programas tendrán diferentes requisitos (solicitudes) para los tamaños de estas secciones. Todo esto está especificado en el encabezado.

  • Algunos formatos también le permitirán incrustar unfirma digital, que permite verificar de dónde vino el binario.


  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa el formato ejecutable portátil?

Las razones son principalmente históricas, y los sistemas operativos tienden a mantener su formato 'nativo' (o 'predeterminado') existente a menos que exista una razón convincente para cambiar (como ha sucedido, por ejemplo, del formato DOS MZ a PE en NT 3.1, y de un .out a ELF en Linux 1.2, y de COFF a ELF en varios Unix a lo largo de los años).

Cabe señalar que el código de máquina subyacente depende de la arquitectura de la CPU, pero por lo demás (aparte de las llamadas al sistema y las bibliotecas vinculadas) es en gran medida portátil entre sistemas operativos. De hecho, Windows y Linux modernos pueden ejecutar ambos formatos ejecutables: los ejecutables ELF se ejecutarán en Windows a través de WSL y los ejecutables PE se ejecutarán en Linux a través de WINE.

  1. ¿Se puede crear un sistema operativo y un programa que se ejecuta en ese sistema operativo sin esta especificación de formato binario?

Volvemos al propósito principal de estos formatos. Sin los metadatos que le indiquen al sistema operativo dónde cargar partes del programa, la mayoría de los ejecutables modernos no pueden ejecutarse. Algunos formatos muy antiguos comoCOMPrácticamente contienen código puro, pero no son particularmente flexibles y han caído en desgracia.

En la práctica, ni siquiera es necesario que exista un sistema operativo. A nivel de hardware, suponiendo la existencia de una BIOS (heredada),el BIOS simplemente comenzará a ejecutarse en una ubicación específica del disco (MBR), que puede ser un código de máquina arbitrario que luego toma el control e inicia un sistema operativo o hace cualquier otra cosa que desee. (Puede ver el MBR en sí como un formato binario, aunque no está directamente relacionado con el código ejecutable). Sin embargo, el UEFI más moderno especifica un formato ejecutable (PE) más complejo.

  1. ¿La arquitectura del formato binario depende del sistema operativo, o de ambos?

Depende del formato, de verdad. Algunos formatos asumen una arquitectura específica. Otros le permiten seleccionar la arquitectura de una lista de "números mágicos" especificados en el encabezado. Otros son completamente independientes de la arquitectura (por ejemplo, código de bytes Java y .NET/CIL).

De manera similar, el formato generalmente no impone ninguna restricción al sistema operativo, aunque el sistema operativo tendrá restricciones en cuanto a los formatos que puede reconocer y ejecutar (de forma nativa). Por supuesto, las capas de compatibilidad encima del sistema operativo principal pueden ejecutar otros formatos (por ejemplo, JVM, .NET/CLR, WSL&WINE, etc.) que el sistema operativo principal puede no reconocer.

  1. ¿El formato binario se aplica solo a archivos ejecutables o también al código del sistema operativo?

Una gran parte de la mayoría de los sistemas operativos modernos es sólo una colección de archivos ejecutables "normales". Sin embargo, algunas partes del sistema operativo son "especiales" y no necesariamente utilizarán el mismo formato que el resto. Por lo general, esto se aplica sólo al gestor de arranque y al kernel.

Para tomar un ejemplo específico, muy común, el gestor de arranque del BIOS heredadonoestar en los formatos ELF o PE utilizados por Linux y Windows. El kernel de Linux generalmente está construido en unFormato derivado de ELFque el gestor de arranque GRUBpuede cargar, pero podría estar en un formato diferente para que sea compatible con el gestor de arranque utilizado. El kernel de Linux también admite unaTrozo EFImodo, que contiene un encabezado PE/COFF mínimo para ser compatible con el arranque UEFI directo.

Respuesta2

El uso principal del formato es cargar programas en la memoria, lo cual se realiza mediante uncargador.

  1. ¿Por qué se necesita una especificación separada para el código binario: Linux usa ELF y Windows usa el formato de ejecución portátil?

Respuesta cortés: porque el sistema operativo es diferente y tiene requisitos diferentes. Respuesta de un usuario de Unix: porque a Microsoft le gusta reinventar la rueda (cuadrada).

  1. ¿Se pueden crear un sistema operativo y un programa que se ejecuta en ese sistema operativo sin esta especificación de formato binario?

Sí, pero sólo los muy triviales, un sistema operativo bastante básico que ejecuta programas triviales que no necesitan "reubicarse" y no necesitan vincularse a ningún código externo.

  1. ¿La arquitectura del formato binario depende del sistema operativo, o de ambos?

Ninguno, el formato ELF se utiliza con muchos sistemas operativos y arquitecturas.

  1. ¿El formato binario es aplicable sólo a archivos ejecutables o también es aplicable al código del sistema operativo?

En Linux, es posible que el kernel de arranque no sea ELF, pero los módulos del kernel usan el formato ELF.

información relacionada