Wie Sie vielleicht schon erraten haben, enthalten ausführbare Formate mehr als nur Maschinencode. Zum Beispiel können sie:
- Geben Sie Metadaten für das Betriebssystem an, z. B. für welche Architektur die ausführbare Datei vorgesehen ist. Diese Metadaten umfassen den Header der Datei.
Geben Sie das Programm - Layout im Speicher. In modernen Betriebssystemen werden die meisten ausführbaren Dateien nicht in einem einzigen Block in den Speicher geladen - sie haben normalerweise viele separate Regionen / Abschnitte / Segmente . Einige dieser Segmente enthalten ausführbaren Code. Einige von ihnen enthalten unveränderliche Daten wie Textzeichenfolgen. Einige davon werden als beschreibbarer Speicher für die Programmheap (s) bezeichnet.
Unterschiedliche Programme haben unterschiedliche Anforderungen (Anforderungen) für die Größe dieser Abschnitte. Dies ist alles in der Kopfzeile angegeben.
In einigen Formaten können Sie auch eine digitale Signatur einbetten, um zu überprüfen, woher die Binärdatei stammt.
- Warum ist eine separate Spezifikation für den Binärcode erforderlich - Linux verwendet ELF und Windows das Portable Executable Format?
Die Gründe sind in erster Linie historisch, und Betriebssysteme neigen dazu, bei ihrem vorhandenen 'nativen' (oder 'default') Format zu bleiben, es sei denn, es gibt einen zwingenden Grund für einen Wechsel (wie z. B. vom DOS-MZ-Format zu PE in NT 3.1 und von a .out an ELF in Linux 1.2 und von COFF an ELF in verschiedenen Unixen im Laufe der Jahre).
Es ist zu beachten, dass der zugrunde liegende Maschinencode von der CPU-Architektur abhängt, ansonsten (abgesehen von Systemaufrufen und verknüpften Bibliotheken) weitgehend zwischen Betriebssystemen portierbar ist. Tatsächlich können moderne Windows und Linux beide ausführbaren Formate ausführen: ELF-ausführbare Dateien werden unter Windows über WSL und PE-ausführbare unter Linux über WINE ausgeführt.
- Können ein Betriebssystem und ein Programm, das auf diesem Betriebssystem ausgeführt wird, ohne diese Binärformatspezifikation erstellt werden?
Wir gehen auf den Hauptzweck dieser Formate zurück. Die meisten modernen ausführbaren Dateien können nicht ausgeführt werden, wenn die Metadaten dem Betriebssystem nicht mitteilen, wo Teile des Programms geladen werden sollen. Einige sehr alte Formate wie COM enthalten ziemlich viel reinen Code, sind jedoch nicht besonders flexibel und haben sich in Ungnade gefallen.
In der Praxis besteht nicht einmal die Notwendigkeit eines Betriebssystems. Auf Hardwareebene wird das BIOS unter der Annahme eines (älteren) BIOS einfach an einer bestimmten Stelle auf der Festplatte (MBR) ausgeführt, wobei es sich um beliebigen Maschinencode handeln kann, der dann ein Betriebssystem übernimmt und entweder ein Betriebssystem startet oder irgendetwas tut sonst mag es. (Sie können den MBR selbst als Binärformat anzeigen, obwohl er nicht direkt mit dem ausführbaren Code zusammenhängt.) Die modernere UEFI gibt jedoch ein komplexeres ausführbares Format (PE) an.
- Ist die Architektur des binären Formats abhängig, abhängig vom Betriebssystem 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" in der Kopfzeile auswählen. Wieder andere sind vollständig architekturunabhängig (z. B. Java und .NET / CIL-Bytecode).
In ähnlicher Weise erlegt das Format im Allgemeinen keine Einschränkung für das Betriebssystem auf, obwohl das Betriebssystem darauf beschränkt ist, in welchen Formaten es (nativ) erkannt und ausgeführt werden kann. Natürlich können Kompatibilitätsebenen auf dem Kernbetriebssystem andere Formate ausführen (z. B. JVM, .NET / CLR, WSL & WINE usw.), die das Kernbetriebssystem möglicherweise nicht erkennt.
- Ist das Binärformat nur für ausführbare Dateien oder auch für den Betriebssystemcode anwendbar?
Ein großer Teil der meisten modernen Betriebssysteme besteht nur aus einer 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.
Ziehen einen bestimmten, sehr häufig, beispielsweise wird die Legacy - BIOS - Bootloader nicht in entweder den ELF oder PE - Formate, die von Linux und Windows. Der Linux-Kernel ist im Allgemeinen in einem von ELF abgeleiteten Format aufgebaut, das der GRUB-Bootloader laden kann, er kann jedoch in einem anderen Format vorliegen, um mit dem verwendeten Bootloader kompatibel zu sein. Der Linux-Kernel unterstützt auch einen EFI-Stub- Modus, der einen minimalen PE / COFF-Header enthält, um mit dem direkten UEFI-Boot kompatibel zu sein.