Als jemand, der Programme geschrieben hat, die ohne Betriebssystem laufen, gebe ich eine definitive Antwort.
Braucht eine ausführbare Datei einen Betriebssystemkern, um ausgeführt zu werden?
Das hängt davon ab, wie das Programm geschrieben und gebaut wurde.
Sie könnten ein Programm schreiben (vorausgesetzt, Sie verfügen über das Wissen), das überhaupt kein Betriebssystem erfordert.
Ein solches Programm wird als eigenständig bezeichnet .
Bootloader und Diagnoseprogramme sind typische Anwendungen für eigenständige Programme.
Ein typisches Programm, das in einer Host-Betriebssystemumgebung geschrieben und eingebaut wurde, würde jedoch standardmäßig in derselben Host-Betriebssystemumgebung ausgeführt.
Es sind sehr explizite Entscheidungen und Aktionen erforderlich, um ein eigenständiges Programm zu schreiben und zu erstellen.
... die Ausgabe des Compilers ist der Maschinencode (ausführbar), von dem ich dachte, dass er Anweisungen an die CPU direkt waren.
Richtig.
Vor kurzem las ich über Kernel nach und fand heraus, dass Programme nicht direkt auf die Hardware zugreifen können, sondern den Kernel durchlaufen müssen.
Diese Einschränkung wird durch einen CPU-Modus auferlegt, den das Betriebssystem zum Ausführen von Programmen verwendet, und wird durch bestimmte Build-Tools wie Compiler und Bibliotheken erleichtert.
Es ist keine intrinsische Einschränkung für jedes Programm, das jemals geschrieben wurde.
Wenn wir also einfachen Quellcode kompilieren, beispielsweise mit einer printf () - Funktion, und die Kompilierung den ausführbaren Maschinencode erzeugt, wird jeder Befehl in diesem Maschinencode direkt aus dem Speicher ausgeführt (sobald der Code vom Betriebssystem in den Speicher geladen wird) ) oder muss jeder Befehl im Maschinencode noch durch das Betriebssystem (Kernel) laufen, um ausgeführt zu werden?
Jede Anweisung wird von der CPU ausgeführt.
Eine Anweisung, die nicht unterstützt oder unzulässig ist (z. B. hat der Prozess keine ausreichenden Berechtigungen), führt zu einer sofortigen Ausnahme und die CPU führt stattdessen eine Routine aus, um diesen ungewöhnlichen Zustand zu behandeln.
Eine printf () - Funktion sollte nicht als Beispiel für "einfachen Quellcode" verwendet werden .
Die Übersetzung von einer objektorientierten übergeordneten Programmiersprache in Maschinencode ist möglicherweise nicht so unbedeutend, wie Sie meinen.
Und dann wählen Sie eine der komplexesten Funktionen aus einer Laufzeitbibliothek, die Datenkonvertierungen und E / A durchführt.
Beachten Sie, dass Ihre Frage eine Umgebung mit einem Betriebssystem (und einer Laufzeitbibliothek) festlegt.
Sobald das System hochgefahren ist und das Betriebssystem die Kontrolle über den Computer hat, sind die Möglichkeiten für ein Programm eingeschränkt (zB E / A muss vom Betriebssystem ausgeführt werden).
Wenn Sie davon ausgehen, ein eigenständiges Programm auszuführen (dh ohne Betriebssystem), müssen Sie den Computer nicht starten, um das Betriebssystem auszuführen.
... was passiert, nachdem der Maschinencode in den Speicher geladen wurde?
Das hängt von der Umgebung ab.
Bei einem Standalone-Programm kann es ausgeführt werden, dh die Steuerung wird durch Springen an die Startadresse des Programms übergeben.
Für ein vom Betriebssystem geladenes Programm muss das Programm dynamisch mit den gemeinsam genutzten Bibliotheken verknüpft sein, von denen es abhängig ist. Das Betriebssystem muss einen Ausführungsbereich für den Prozess erstellen, der das Programm ausführen soll.
Wird es durch den Kernel gehen oder direkt mit dem Prozessor sprechen?
Maschinencode wird ausgeführt durch die CPU.
Sie "gehen nicht durch den Kernel", aber sie sprechen auch nicht mit dem Prozessor .
Der Maschinencode (bestehend aus Operationscode und Operanden) ist eine Anweisung an die CPU, die dekodiert wird und die Operation ausgeführt wird.
Das nächste Thema, das Sie untersuchen sollten, sind die CPU-Modi .