En tant que personne ayant écrit des programmes qui s'exécutent sans système d'exploitation, j'offre une réponse définitive.
Un exécutable aurait-il besoin d'un noyau de système d'exploitation pour s'exécuter?
Cela dépend de la façon dont ce programme a été écrit et construit.
Vous pouvez écrire un programme (en supposant que vous ayez les connaissances) ne nécessitant pas de système d'exploitation du tout.
Un tel programme est décrit comme autonome .
Les chargeurs de démarrage et les programmes de diagnostic sont des utilisations typiques des programmes autonomes.
Toutefois, le programme typique écrit et intégré dans un environnement de système d'exploitation hôte s'exécutait par défaut dans le même environnement de système d'exploitation hôte.
Des décisions et des actions très explicites sont nécessaires pour écrire et construire un programme autonome.
... la sortie du compilateur est le code machine (exécutable) que je pensais être des instructions directement à la CPU.
Correct.
Récemment, j'étais en train de lire sur les noyaux et j'ai découvert que les programmes ne peuvent pas accéder directement au matériel, mais doivent passer par le noyau.
Il s’agit d’une restriction imposée par un mode de processeur utilisé par le système d’exploitation pour exécuter des programmes, et facilitée par certains outils de compilation tels que les compilateurs et les bibliothèques.
Ce n'est pas une limitation intrinsèque à tous les programmes jamais écrits.
Ainsi, lorsque nous compilons un code source simple, par exemple avec une fonction printf (), et que la compilation produit le code machine exécutable, chaque instruction de ce code machine sera directement exécutée à partir de la mémoire (une fois le code chargé en mémoire par le système d'exploitation). ) ou chaque commande du code machine doit-elle toujours passer par le système d'exploitation (noyau) pour être exécutée?
Chaque instruction est exécutée par la CPU.
Une instruction non prise en charge ou illégale (par exemple, le processus a des privilèges insuffisants) provoquera une exception immédiate et la CPU exécutera une routine pour gérer cette condition inhabituelle.
Une fonction printf () ne doit pas être utilisée comme exemple de "code source simple" .
La traduction d'un langage de programmation de haut niveau orienté objet vers le code machine risque de ne pas être aussi simple que vous l'imaginez.
Ensuite, vous choisissez l'une des fonctions les plus complexes d'une bibliothèque d'exécution qui effectue des conversions de données et des E / S.
Notez que votre question stipule un environnement avec un système d'exploitation (et une bibliothèque d'exécution).
Une fois le système démarré et le système d'exploitation donné à l'ordinateur, des restrictions sont imposées à ce qu'un programme peut faire (par exemple, les E / S doivent être effectuées par le système d'exploitation).
Si vous envisagez d'exécuter un programme autonome (c'est-à-dire sans système d'exploitation), vous ne devez pas démarrer l'ordinateur pour exécuter le système d'exploitation.
... que se passe-t-il après le chargement du code machine dans la mémoire?
Cela dépend de l'environnement.
Pour un programme autonome, il peut être exécuté, c’est-à-dire que le contrôle est transféré en sautant à l’adresse de départ du programme.
Pour un programme chargé par le système d'exploitation, le programme doit être lié de manière dynamique aux bibliothèques partagées dont il dépend. Le système d'exploitation doit créer un espace d'exécution pour le processus qui exécutera le programme.
Va-t-il passer par le noyau ou parler directement au processeur?
Le code machine est exécuté par la CPU.
Ils ne "passent pas par le noyau" , mais "ne parlent pas au processeur" .
Le code machine (composé du code d'opération et des opérandes) est une instruction de la CPU qui est décodée et l'opération effectuée.
Peut-être que le prochain sujet à examiner concerne les modes de processeur .