
Hängt die Existenz eines Linkers (zum Ausführen des Linkens nach der Kompilierung) und eines Loaders (zum Ausführen einer ausführbaren Datei) nicht von Betriebssystemen wie Linux ab? (Ich hatte gedacht, dass Linker und Loader in Linux entweder vom Betriebssystem oder von der Software bereitgestellt werden, genau wie bei anderen Anwendungsprogrammen. Jetzt denke ich, dass sie sehr speziell und unterschiedlich sind. Sie könnten gleich sein, unabhängig davon, welches Betriebssystem installiert ist.)
Gibt es Linker und Loader auf Maschinensprachenebene, also auf ISA-Ebene? (Auf dieser Ebene gibt es kein Betriebssystem.) Oder auf Assemblersprachenebene?
Ist es aus der Perspektive der Programmiersoftware richtig, sich ein Betriebssystem als eine (oder mehrere) Programmierbibliothek(en) vorzustellen?
Danke.
Ich möchte wissen, wo Linker und Loader in die Ebenen/Schichten eines Computersystems eingefügt werden.
Informationen zu den Schichten/Ebenen eines Computersystems finden Sie in Nisans „The Elements of Computer Systems“:
Informationen zum Verknüpfen und Laden finden Sie unterComputersysteme: Die Perspektive eines Programmierers
Antwort1
Hängt die Existenz eines Linkers (zum Ausführen des Linkens nach der Kompilierung) und eines Loaders (zum Ausführen einer ausführbaren Datei) nicht von Betriebssystemen wie Linux ab? (Ich hatte gedacht, dass Linker und Loader in Linux entweder vom Betriebssystem oder von der Software bereitgestellt werden, genau wie bei anderen Anwendungsprogrammen. Jetzt denke ich, dass sie sehr speziell und anders sind.)
Der Linker und der Loader haben, wie jede andere Anwendung auch, einen bestimmten Zweck. Sie sind wichtig für den Aufbau statischer Programme und den Aufbau und das Laden dynamischer Programme, aber sie sind „normale“ Anwendungen (oder Bibliotheken, im Fall des Laufzeit-Loaders) —dhobwohl sie komplex sind, sind sie vermutlich nicht auf besondere Unterstützung durch das Betriebssystem angewiesen.
Damit ist es möglich, Programme eines Betriebssystems auf einem anderen zu verlinken (z.BWindows-Programme unter Linux erstellen oder umgekehrt) und dynamisch verknüpfte Programme, die für ein System erstellt wurden, auf einem anderen laden (siehe Wine). Die wichtigsten Anforderungen an das Betriebssystem sind, dass es eine Möglichkeit bietet, neue ausführbare Inhalte zu laden (dheinem laufenden Programm erlauben, sich selbst ausführbaren Speicher hinzuzufügen) und dass es genügend Kontrolle über den virtuellen Adressraum ermöglicht, um die Anforderungen des Programms zu erfüllen (insbesondere Basisadressen zum Laden von ausführbaren Dateien und Bibliotheken).
Gibt es Linker und Loader auf Maschinensprachenebene, also auf ISA-Ebene? (Auf dieser Ebene gibt es kein Betriebssystem.) Oder auf Assemblersprachenebene?
Ich bin mir nicht sicher, was zu diesen Fragen geführt hat, aber Linker arbeiten mit Symbolen und Adressen. Sie arbeiten mit Objektdateien, die Tabellen mit importierten und exportierten Symbolen enthalten, sowie mit Verschiebungseinträgen, in die vom Linker berechnete Werte eingetragen werden.
Ist es richtig, sich ein Betriebssystem als eine Programmierbibliothek (Bibliotheken) vorzustellen?
Das ist sehr einschränkend. Ein Betriebssystem stellt den darauf laufenden Anwendungen einige Dienste zur Verfügung, aber es leistet noch viel mehr, selbst bei wirklich einfachen Betriebssystemen (8-Bit-Mikros, MS-DOS usw.); es verarbeitet beispielsweise Hardware-Interrupts, plant Prozesse (für Multitasking-Systeme), kontrolliert Zugriffsberechtigungen (für Mehrbenutzersysteme mit Zugriffskontrolle)...
Ich habe den Eindruck, dass das Diagramm, auf das Sie sich beziehen, eher als Buchübersicht nützlich ist als zum Verständnis der Computerarchitektur.