Warum ist für ausführbare Dateien eine Binärformatspezifikation erforderlich?

Warum ist für ausführbare Dateien eine Binärformatspezifikation erforderlich?

Ich verstehe, dass ein Betriebssystem wie Linux oder Windows in C/C++ geschrieben und für eine bestimmte Architektur (z. B. AMD64) kompiliert wird, um einen Maschinencode zu erzeugen, der für diese Architektur geeignet ist.

Meine Fragen -

  1. Warum ist für den Binärcode eine separate Spezifikation erforderlich – Linux verwendet ELF und Windows Portable Executable Format?
  2. Können ein Betriebssystem und ein auf diesem Betriebssystem laufendes Programm ohne diese Spezifikation des Binärformats erstellt werden?
  3. Ist das Binärformat architekturabhängig, betriebssystemabhängig oder beides?
  4. Ist das Binärformat nur auf ausführbare Dateien anwendbar oder auch auf den Betriebssystemcode?

Antwort1

Wie Sie vielleicht schon vermutet haben, enthalten ausführbare Formate mehr als nur Maschinencode. Sie können beispielsweise:

  • Geben Sie Metadaten für das Betriebssystem an, z. B. für welche Architektur die ausführbare Datei vorgesehen ist. Diese Metadaten umfassen dieHeaderder Datei.

  • Geben Sie das Programm anLayoutim Speicher. Auf modernen Betriebssystemen werden die meisten ausführbaren Dateien nicht in einem einzigen Block in den Speicher geladen - sie haben normalerweise viele separateRegionen/Abschnitte/Segmente. Einige dieser Segmente enthalten ausführbaren Code. Einige enthalten unveränderliche Daten, wie etwa Textzeichenfolgen. Einige sind als beschreibbarer Speicher für die Programm-Heaps vorgesehen.

    Verschiedene Programme haben unterschiedliche Anforderungen (Anforderungen) an die Größe dieser Abschnitte. Dies wird alles im Header angegeben.

  • Einige Formate ermöglichen auch die Einbettung einesDigitale Unterschrift, wodurch die Herkunft der Binärdatei überprüft werden kann.


  1. Warum ist für den Binärcode eine separate Spezifikation erforderlich – Linux verwendet ELF und Windows Portable Executable Format?

Die Gründe hierfür sind in erster Linie historischer Natur und Betriebssysteme neigen dazu, bei ihrem vorhandenen „nativen“ (oder „Standard-“)Format zu bleiben, sofern es keinen zwingenden Grund für eine Umstellung gibt (wie es z. B. vom DOS-MZ-Format zu PE in NT 3.1, von a.out zu ELF in Linux 1.2 und im Laufe der Jahre von COFF zu ELF in verschiedenen Unix-Versionen geschehen ist).

Es ist zu beachten, dass der zugrunde liegende Maschinencode von der CPU-Architektur abhängt, ansonsten aber (abgesehen von Systemaufrufen und verknüpften Bibliotheken) weitgehend zwischen Betriebssystemen portierbar ist. Tatsächlich können moderne Windows- und Linux-Versionen beide ausführbaren Formate ausführen: ELF-ausführbare Dateien laufen unter Windows über WSL und PE-ausführbare Dateien unter Linux über WINE.

  1. Können ein Betriebssystem und ein auf diesem Betriebssystem laufendes Programm ohne diese Spezifikation des Binärformats erstellt werden?

Kommen wir zurück zum Hauptzweck dieser Formate. Ohne die Metadaten, die dem Betriebssystem mitteilen, wo Teile des Programms geladen werden sollen, können die meisten modernen ausführbaren Dateien nicht ausgeführt werden. Einige sehr alte Formate wieCOMenthalten größtenteils reinen Code, sind aber nicht besonders flexibel und sind in Ungnade gefallen.

In der Praxis ist es nicht einmal notwendig, dass ein Betriebssystem existiert. Auf Hardwareebene, vorausgesetzt, dass ein (Legacy-)BIOS existiert,Das BIOS wird einfach an einer bestimmten Stelle auf der Festplatte (MBR) ausgeführt., das kann beliebiger Maschinencode sein, der dann übernimmt und entweder ein Betriebssystem startet oder sonst etwas tut, was er will. (Sie können den MBR selbst als Binärformat betrachten, obwohl er nicht direkt mit dem ausführbaren Code zusammenhängt.) Das modernere UEFI gibt jedoch ein komplexeres ausführbares Format (PE) an.

  1. Ist das Binärformat architekturabhängig, betriebssystemabhängig oder beides?

Hängt wirklich vom Format ab. Einige Formate setzen eine bestimmte Architektur voraus. Bei anderen können Sie die Architektur aus einer Liste mit angegebenen „magischen Zahlen“ im Header auswählen. Wieder andere sind völlig architekturunabhängig (z. B. Java- und .NET/CIL-Bytecode).

Ebenso stellt das Format im Allgemeinen keine Einschränkung für das Betriebssystem dar, obwohl das Betriebssystem in Bezug auf die Formate, die es (nativ) erkennen und ausführen kann, eingeschränkt ist. Natürlich können Kompatibilitätsebenen über dem Kernbetriebssystem andere Formate ausführen (z. B. JVM, .NET/CLR, WSL&WINE usw.), die das Kernbetriebssystem möglicherweise nicht erkennt.

  1. Ist das Binärformat nur auf ausführbare Dateien anwendbar oder auch auf den Betriebssystemcode?

Ein großer Teil der meisten modernen Betriebssysteme ist nur eine Sammlung „normaler“ ausführbarer Dateien. Einige Teile des Betriebssystems sind jedoch „speziell“ und verwenden nicht unbedingt dasselbe Format wie der Rest. Normalerweise gilt dies nur für den Bootloader und den Kernel.

Um ein spezifisches, sehr verbreitetes Beispiel zu nennen: Der alte BIOS-Bootloader wirdnichtentweder im ELF- oder PE-Format vorliegen, das von Linux und Windows verwendet wird. Der Linux-Kernel wird im Allgemeinen in einemVon ELF abgeleitetes Formatdass der GRUB-Bootloaderkann laden, aber es könnte in einem anderen Format vorliegen, um mit dem verwendeten Bootloader kompatibel zu sein. Der Linux-Kernel unterstützt auch eineEFI-StubModus, der einen minimalen PE/COFF-Header enthält, um mit dem direkten UEFI-Boot kompatibel zu sein.

Antwort2

Die Hauptanwendung des Formats ist das Laden von Programmen in den Speicher. Dies geschieht durchLader.

  1. Warum ist für den Binärcode eine separate Spezifikation erforderlich – Linux verwendet ELF und Windows Portable Execution Format?

Höfliche Antwort: weil das Betriebssystem anders ist und andere Anforderungen hat. Antwort eines Unix-Benutzers: weil Microsoft das (quadratische) Rad gerne neu erfindet.

  1. Können ein Betriebssystem und ein auf diesem Betriebssystem laufendes Programm ohne diese Spezifikation des Binärformats erstellt werden?

Ja, aber nur die ganz trivialen, also ein ziemlich einfaches Betriebssystem, das triviale Programme ausführt, die nicht „verlagert“ werden müssen und keine Verknüpfung mit externem Code benötigen.

  1. Ist das Binärformat architekturabhängig, betriebssystemabhängig oder beides?

Keine, das ELF-Format wird von vielen Betriebssystemen und Architekturen verwendet.

  1. Ist das Binärformat nur auf ausführbare Dateien anwendbar oder auch auf den Betriebssystemcode?

Unter Linux ist der bootfähige Kernel möglicherweise nicht ELF, aber die Kernelmodule verwenden das ELF-Format.

verwandte Informationen