Unterschied zwischen Programmen, die für verschiedene Betriebssysteme kompiliert wurden
8
Unter dem Gesichtspunkt des kompilierten Codes besteht der Unterschied zwischen einem Programm, das für ein Betriebssystem kompiliert wurde, und einem anderen (z. B. Linux und Windows). Läuft das Programm nicht direkt auf der CPU? Oder liegt es daran, dass das Programm auf betriebssystemspezifische Bibliotheken verweisen muss?
Gewöhnliche kompilierte Programme werden "direkt" auf der CPU ausgeführt, aber ein Programm wird nicht im luftleeren Raum ausgeführt:
Viele Programme basieren auf externen, dynamisch geladenen Bibliotheken ( DLLsoder .soBibliotheken). Die Art und Weise, wie sie verknüpft werden, hängt vom Compiler / Linker ab, und jedes Betriebssystem hat unterschiedliche Standards. Es gibt jedoch auch "statisch verknüpfte" Programme, die ihren gesamten Code bereitstellen.
Ein modernes Betriebssystem gibt einem laufenden Programm keine vollständige Kontrolle über den Computer. Programme basieren auf "Systemaufrufen" für E / A, Zugriff auf Hardware und Dinge wie Signale und das Eintreten in einen Ruhezustand. Die verfügbaren Dienste und Schnittstellen werden vom Betriebssystem definiert. Das Betriebssystem steuert auch, welche Teile des Systems (Speicher, Register, Interrupts) das Programm verwenden darf.
Ein GUI-Programm muss auch die grafische Benutzerumgebung durchlaufen, um sich selbst auf dem Bildschirm zu zeichnen. Aber darüber haben Sie wahrscheinlich schon nachgedacht.
Aus diesen Gründen müssen betriebssystemunabhängige Anwendungen auf eine Art "virtuelle Maschine" angewiesen sein, wie sie von der Java-Laufzeit bereitgestellt wird. Entscheidend ist, dass eine VM eine Standardschnittstelle zu Betriebssystemressourcen (E / A, Signale usw.) bietet. Natürlich interpretieren Java oder Python auch "Bytecode", anstatt sich mit den Macken des Intel-Befehlssatzes zu befassen. aber das ist eine andere Geschichte.
Darüber hinaus haben verschiedene Betriebssysteme unterschiedliche Standards für das Stapellayout, die Speicherausrichtungspraktiken usw., sodass sich möglicherweise auch rein numerischer / rechnerischer Code von einem Betriebssystem zum nächsten unterscheiden muss.
Daniel R Hicks
Würden diese Unterschiede die Ausführung von statisch kompiliertem Code verhindern? Wusste nicht, dass ..
Alexis
Es ist wahrscheinlich nur ein theoretisches Problem, da eine andere Inkompatibilität Sie zuerst bekommen würde. Betriebssysteme haben jedoch häufig Erwartungen an die Ausrichtung von Stapelrahmen, die Speicherung von Registern usw. Diese können für dieselbe Hardwarearchitektur von Betriebssystem zu Betriebssystem unterschiedlich sein. Theoretisch könnten Sie möglicherweise "fremden" Code ausführen, der rein rechnerisch ist, aber Sie könnten ihn niemals starten und niemals sauber beenden.
Daniel R Hicks
5
Verschiedene Betriebssysteme haben auch unterschiedliche Funktionen. Windows verfügt über E / A-Abschlussports, Linux nicht. FreeBSD hat kqueue, Linux nicht. Linux hat Futexe, Windows nicht. Sie haben auch verschiedene Möglichkeiten, dasselbe zu tun - welche Parameter übergeben Sie, um eine Datei zu öffnen? In welcher Reihenfolge gehen sie? Wie konkret rufen Sie die Funktion "Datei öffnen" des Betriebssystems auf?
OK, das macht Sinn, aber im Allgemeinen wird das Programm in den Speicher geladen und auf der CPU ausgeführt, oder hat das Betriebssystem die Kontrolle über das Programm
agz
1
@agovizer: Beides. Sie schließen sich nicht gegenseitig aus. In der Regel richtet das Betriebssystem eine kontrollierte Umgebung ein und sorgt dafür, dass die Hardware das Programm in einer bestimmten Zeitspanne unterbricht und dann den Kern dem Programm übergibt. Sobald das Programm jedoch eine beliebige Anzahl von Bedingungen erfüllt (z. B. einen Seitenfehler, eine E / A-Operation oder dergleichen), übernimmt das Betriebssystem erneut.
NEIN ! Dies ist die Aufgabe des Betriebssystems, um zu verhindern , dass Anwendungen "direkt" auf der CPU ausgeführt werden. In der Regel ist eine Anwendung auf der untersten Ebene (dh auf der Ebene, auf der die Betriebssystem-API basiert) mit dem Kernel des Betriebssystems verbunden .
Liegt es daran, dass das kompilierte Programm selbst auf betriebssystemspezifische Bibliotheken verweisen muss?
Ja . Viele Betriebssystembibliotheken wurden geschrieben, um die Anbindung an das Betriebssystem selbst zu erleichtern. Es gibt jedoch ebenso viele, die plattformübergreifend geschrieben wurden. Diese verbergen die Low-Level-Betriebssystemschnittstelle vor dem Entwickler und gehen davon aus, dass die kompilierte Version für dieses Betriebssystem zur Laufzeit verfügbar ist (siehe unten).
Obwohl Bibliotheken werden geschrieben in einer plattformübergreifende Art und Weise, wenn kompiliert , können sie nicht werden , laufen Cross-Plattform. Sie müssen noch für das spezifische Zielbetriebssystem neu kompiliert werden, um wiederum die bestimmten zugrunde liegenden Komponenten des Betriebssystems (Kernels) zu nutzen.
Was ist der Unterschied zwischen einem kompilierten Programm für ein Betriebssystem und einem anderen?
Schließlich enthalten ausführbare Dateien selbst häufig sehr spezifische binäre Ladeheader usw. (z. B. das ausführbare PE- Dateiformat [.exe, .dll usw.] für Windows oder ELF für Linux [none, .o, .so , usw...]). Diese können auch Code zum Laden der kompilierten betriebssystemspezifischen Binärdateien für eine bestimmte Softwarebibliothek enthalten.
Aus Sicht eines Programmierers: Aufruf der Konvention . Kompilierter Code übergibt Variablen in einer bestimmten Reihenfolge (dh über Register oder auf dem Stapel) an Funktionen. Selbst dann muss vereinbart werden, wer für die "Bereinigung" von Funktionsaufrufen verantwortlich ist (der Anrufer oder der Angerufene?). Obwohl es mehrere standardmäßige und weit verbreitete x86-Aufrufkonventionen gibt , werden einige möglicherweise von bestimmten Betriebssystemen nicht unterstützt (dies ist Teil des ABI).
Verschiedene Betriebssysteme haben auch unterschiedliche Funktionen. Windows verfügt über E / A-Abschlussports, Linux nicht. FreeBSD hat kqueue, Linux nicht. Linux hat Futexe, Windows nicht. Sie haben auch verschiedene Möglichkeiten, dasselbe zu tun - welche Parameter übergeben Sie, um eine Datei zu öffnen? In welcher Reihenfolge gehen sie? Wie konkret rufen Sie die Funktion "Datei öffnen" des Betriebssystems auf?
quelle
Im Allgemeinen sind Programme aufgrund der Unterschiede in ihrer Anwendungsbinärschnittstelle (ABI) nicht kompatibel .
NEIN ! Dies ist die Aufgabe des Betriebssystems, um zu verhindern , dass Anwendungen "direkt" auf der CPU ausgeführt werden. In der Regel ist eine Anwendung auf der untersten Ebene (dh auf der Ebene, auf der die Betriebssystem-API basiert) mit dem Kernel des Betriebssystems verbunden .
Ja . Viele Betriebssystembibliotheken wurden geschrieben, um die Anbindung an das Betriebssystem selbst zu erleichtern. Es gibt jedoch ebenso viele, die plattformübergreifend geschrieben wurden. Diese verbergen die Low-Level-Betriebssystemschnittstelle vor dem Entwickler und gehen davon aus, dass die kompilierte Version für dieses Betriebssystem zur Laufzeit verfügbar ist (siehe unten).
Obwohl Bibliotheken werden geschrieben in einer plattformübergreifende Art und Weise, wenn kompiliert , können sie nicht werden , laufen Cross-Plattform. Sie müssen noch für das spezifische Zielbetriebssystem neu kompiliert werden, um wiederum die bestimmten zugrunde liegenden Komponenten des Betriebssystems (Kernels) zu nutzen.
Schließlich enthalten ausführbare Dateien selbst häufig sehr spezifische binäre Ladeheader usw. (z. B. das ausführbare PE- Dateiformat [.exe, .dll usw.] für Windows oder ELF für Linux [none, .o, .so , usw...]). Diese können auch Code zum Laden der kompilierten betriebssystemspezifischen Binärdateien für eine bestimmte Softwarebibliothek enthalten.
Aus Sicht eines Programmierers: Aufruf der Konvention . Kompilierter Code übergibt Variablen in einer bestimmten Reihenfolge (dh über Register oder auf dem Stapel) an Funktionen. Selbst dann muss vereinbart werden, wer für die "Bereinigung" von Funktionsaufrufen verantwortlich ist (der Anrufer oder der Angerufene?). Obwohl es mehrere standardmäßige und weit verbreitete x86-Aufrufkonventionen gibt , werden einige möglicherweise von bestimmten Betriebssystemen nicht unterstützt (dies ist Teil des ABI).
quelle