Als jemand, der Programme geschrieben hat, die ohne Betriebssystem ausgeführt werden, biete ich eine endgültige Antwort.
Würde eine ausführbare Datei einen Betriebssystemkern benötigen, um ausgeführt zu werden?
Das hängt davon ab, wie das Programm geschrieben und erstellt wurde.
Sie könnten ein Programm schreiben (vorausgesetzt, Sie haben 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.
Das typische Programm, das in einer Host-Betriebssystemumgebung geschrieben und erstellt wird, wird standardmäßig in derselben Host-Betriebssystemumgebung ausgeführt.
Sehr explizite Entscheidungen und Aktionen sind 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 direkt an die CPU enthält.
Richtig.
Kürzlich las ich über Kernel und fand heraus, dass Programme nicht direkt auf die Hardware zugreifen können, sondern den Kernel durchlaufen müssen.
Dies ist eine Einschränkung, die durch einen CPU-Modus bedingt ist, den das Betriebssystem zum Ausführen von Programmen verwendet, und die durch bestimmte Build-Tools wie Compiler und Bibliotheken erleichtert wird.
Dies ist keine wesentliche Einschränkung für jedes Programm, das jemals geschrieben wurde.
Wenn wir also einen einfachen Quellcode kompilieren, beispielsweise mit einer Funktion printf (), 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 wurde) ) oder muss jeder Befehl im Maschinencode noch das Betriebssystem (den Kernel) durchlaufen, 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. ein Prozess hat nicht genügend Berechtigungen), löst eine sofortige Ausnahme aus, 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 Programmiersprache auf hoher Ebene in Maschinencode ist möglicherweise nicht so trivial, wie Sie vermuten.
Anschließend wählen Sie eine der komplexesten Funktionen aus einer Laufzeitbibliothek aus, die Datenkonvertierungen und E / A durchführt.
Beachten Sie, dass Ihre Frage eine Umgebung mit einem Betriebssystem (und einer Laufzeitbibliothek) vorsieht.
Sobald das System hochgefahren ist und das Betriebssystem die Kontrolle über den Computer hat, werden Einschränkungen für die Funktionen eines Programms auferlegt (z. B. muss E / A vom Betriebssystem ausgeführt werden).
Wenn Sie ein eigenständiges Programm ausführen möchten (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.
Für ein eigenständiges Programm kann es ausgeführt werden, dh die Steuerung wird durch Springen zur Startadresse des Programms übergeben.
Für ein vom Betriebssystem geladenes Programm muss das Programm dynamisch mit gemeinsam genutzten Bibliotheken verknüpft werden, von denen es abhängig ist. Das Betriebssystem muss einen Ausführungsbereich für den Prozess erstellen, der das Programm ausführt.
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" , sondern "sprechen mit dem Prozessor" .
Der Maschinencode (bestehend aus Operationscode und Operanden) ist eine Anweisung an die CPU, die decodiert und die Operation ausgeführt wird.
Vielleicht sollten Sie sich als nächstes mit den CPU-Modi befassen .