En tant que personne ayant écrit des programmes qui s'exécutent sans système d'exploitation, je propose une réponse définitive.
Un exécutable aurait-il besoin d'un noyau d'OS pour fonctionner ?
Cela dépend de la façon dont ce programme a été écrit et construit.
Vous pourriez écrire un programme (en supposant que vous ayez les connaissances nécessaires) qui ne nécessite pas du tout de système d'exploitation.
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.
Cependant, le programme typique écrit et construit dans un environnement de système d'exploitation hôte s'exécutera par défaut dans ce 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) qui, je le pensais, était des instructions pour le CPU directement.
Correct.
Récemment, je me suis renseigné 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 du processeur que le système d'exploitation utilise pour exécuter les programmes, et facilitée par certains outils de construction tels que les compilateurs et les bibliothèques.
Il ne s'agit pas d'une limitation intrinsèque à tous les programmes jamais écrits.
Ainsi, lorsque nous compilons un code source simple, par exemple avec une simple fonction printf(), et que la compilation produit le code machine exécutable, chaque instruction de ce code machine sera-t-elle directement exécutée depuis la mémoire (une fois le code chargé en mémoire par le système d'exploitation) ou chaque commande du code machine devra-t-elle encore passer par le système d'exploitation (noyau) pour être exécutée ?
Chaque instruction est exécutée par le CPU.
Une instruction qui n'est pas prise en charge ou qui est illégale (par exemple, un processus ne dispose pas de privilèges suffisants) provoquera une exception immédiate, et le CPU exécutera à la place une routine pour gérer cette condition inhabituelle.
A printf() ne doit pas être utilisée comme un exemple de "code source simple" .
La traduction d'un langage de programmation de haut niveau orienté objet en code machine peut ne pas être aussi triviale que vous le laissez entendre.
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 I/O.
Notez que votre question stipule un environnement avec un OS (et une bibliothèque d'exécution).
Une fois que le système a démarré et que le système d'exploitation a pris le contrôle de l'ordinateur, des restrictions sont imposées sur ce qu'un programme peut faire (par exemple, les E/S doivent être effectuées par le système d'exploitation).
Si vous prévoyez 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 que le code machine soit chargé en 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é dynamiquement 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.
Passera-t-il par le noyau ou parlera-t-il directement au processeur ?
Le code machine est exécuté par l'unité centrale.
Ils ne "passer par le noyau" mais ils ne le font pas non plus "parler au processeur" .
Le code machine (composé du code op et des opérandes) est une instruction adressée au CPU qui est décodée et l'opération est effectuée.
Peut-être que le prochain sujet que vous devriez étudier est Modes de fonctionnement du CPU .