Qui est chargé de déterminer si le processus est en mode Kernel ou en mode Utilisateur ? Je sais que le noyau sait quel processus appartient à quel espace, mais comment le CPU détermine-t-il cela ? Je veux dire que le CPU doit être conscient du mode du processus ou de l'exécution des instructions ? Si oui, comment ? et si non, que se passe-t-il lorsque l'utilisateur veut faire quelque chose d'interdit ? Quand nous disons que l'application de l'utilisateur ne peut voir qu'un sous-ensemble des ressources de la machine, je sais que cela signifie que les applications ne peuvent pas faire des tâches spécifiques, par exemple dans le CPU, mais qui empêche les applications de faire de telles choses et surtout comment ?
Réponses
Trop de publicités?Hm, question assez intéressante. Je vais essayer d'aider...
Qui est chargé de déterminer que le processus est en mode Kernel ou en mode utilisateur ?
Ce sont les concepteurs du système d'exploitation qui en décident :-). Tous les systèmes d'exploitation modernes exécutent tous les processus en mode utilisateur ("anneau 3" en "mode protégé" dans l'architecture x86), car cela est nécessaire pour utiliser des fonctions telles que la protection de la mémoire et la mémoire virtuelle. Les systèmes d'exploitation plus anciens et/ou plus simples peuvent exécuter tous les processus en mode noyau (par exemple, le "mode réel" en x86) ; cela dépend de la conception du système d'exploitation. MS-DOS, par exemple, fonctionnait comme suit.
Notez que les noms et les types de modes processeur diffèrent selon les architectures (x86, Sparc, PowerPC...) ; cependant, tous les processeurs modernes ont des modes "protégés" similaires, que l'on pourrait appeler modes "utilisateur".
Je sais que le noyau sait quel processus appartient à quel espace, mais comment le CPU le détermine-t-il ?
Le CPU ne le "connaît" pas, car il ne sait rien des processus, qui sont des abstractions fournies par le système d'exploitation. L'unité centrale exécute simplement le code qui lui est fourni. Le CPU dispose d'instructions pour passer d'un mode à l'autre, et le système d'exploitation utilise ces instructions pour placer le CPU dans le bon mode, selon les besoins.
Sur x86 par exemple, l'ordinateur démarre en "mode réel" (pour des raisons de compatibilité). Lorsqu'un système d'exploitation tel que Linux ou Windows (NT et supérieur) démarre, l'une des premières choses qu'il fait est de passer en "mode protégé". Il utilise ensuite la fonction "anneaux" pour contrôler l'accès de chaque programme au matériel. Le noyau du système d'exploitation fonctionne dans l'anneau 0 (privilèges complets) ; le logiciel utilisateur fonctionne dans l'anneau 3 (restreint). Lorsque le système d'exploitation passe le contrôle au logiciel utilisateur (c'est-à-dire lorsqu'il démarre ou reprend un processus utilisateur), il passe d'abord dans l'anneau 3. Lorsque le contrôle revient au noyau, l'unité centrale passe à l'anneau 0.
La façon dont la commutation entre les modes/anneaux fonctionne dépend de l'architecture du processeur. La plupart des architectures fournissent des instructions ou des mécanismes spéciaux pour la commutation. Une fois que l'unité centrale a été commutée vers un certain mode/anneau, elle garde la trace de ce mode (et de toute restriction associée) de manière autonome.
Pour plus de détails sur la façon dont cela fonctionne sur l'architecture x86, voir cet article : http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection
A titre d'aparté : Les protections/restrictions dans les modes restreints de l'unité centrale sont principalement mises en œuvre par l'unité de commande de l'ordinateur. Unité de gestion de la mémoire de l'unité centrale. Les processeurs plus anciens et/ou plus simples (tels que le Motorola 68000 utilisé par l'Amiga et l'Atari ST ou le 6510 du C64) n'ont pas de MMU ; ils ne peuvent donc pas exécuter un système d'exploitation qui distingue le mode noyau et le mode utilisateur. C'est pourquoi, par exemple, le portage Linux m68k nécessite au moins un processeur Motorola 68020 pour fonctionner ; les 68000 et 68010 plus anciens ne possèdent pas de MMU.
Je veux dire que le CPU doit être conscient du mode du processus ou de l'exécution d'exécution ? Si oui, comment ?
Oui, le processeur en est conscient dans le sens où il sait dans quel mode il fonctionne actuellement (mais il ne sait pas pourquoi).
et si non, que se passe-t-il lorsque le utilisateur veut faire quelque chose d'interdit ? Quand nous disons que l'application utilisateur ne peut voir un sous-ensemble des machines machines, je sais que cela signifie que que les applications ne peuvent pas effectuer des tâches spécifiques par exemple dans le CPU, mais qui empêche les applications de faire de telles choses et et surtout comment ?
Une très bonne question. L'unité centrale elle-même arrête l'application.
Si un code (une application) s'exécute dans un mode avec des privilèges limités (comme l'anneau 3 en mode protégé sur x86), il y a certaines choses que le code ne peut pas faire (comme accéder à la mémoire en dehors de la zone qui lui a été attribuée). Le CPU le sait et vérifie chaque instruction avant de l'exécuter. Si une violation est détectée, le CPU arrête d'exécuter le code en question (on parle alors d'"exception" ou d'interruption matérielle) et saute à un code spécial de traitement des erreurs (défini à l'avance par le système d'exploitation).
Cela permet de rendre le contrôle au système d'exploitation, qui peut alors faire ce qu'il veut : aller chercher de la mémoire sur le disque si l'exception est due à l'accès à de la mémoire qui a été transférée sur le disque (c'est ainsi que fonctionne la "pagination"), interrompre le processus qui a accédé illégalement à la mémoire (le redoutable "défaut de protection" ou "défaut de segmentation"), etc.
La réponse de base à votre question est la suivante : "L'unité centrale passe en mode noyau lorsqu'une interruption se produit". Comme le système d'exploitation lui-même définit, lors du processus de démarrage, les vecteurs d'interruptions (les gestionnaires), tous ces vecteurs sont dirigés vers... le noyau. Chaque appel système effectué par un processus n'est rien d'autre qu'une interruption (logicielle), c'est-à-dire qu'il appelle le gestionnaire d'interruption qui n'est rien d'autre que le noyau lui-même (avec des paramètres spécifiés dans les registres).
Le noyau, avant de donner le contrôle à un processus utilisateur, règle la minuterie pour qu'elle génère une interruption après un certain temps, met le processeur en mode utilisateur et donne ensuite le contrôle au processus utilisateur. Au bout d'un certain temps, la minuterie génère une interruption et le contrôle revient au noyau.
Bien sûr : jouer avec le timer, jouer avec les vecteurs d'interruption (handlers) et jouer avec les modes du processeur sont toutes des instructions privilégiées et sont autorisées aux processus en mode noyau (c'est-à-dire le noyau lui-même).
Le mode noyau et le mode utilisateur sont des modes de sécurité différents de l'unité centrale. Souvent, les processeurs fournissent encore plus que ces deux modes qui sont mis en œuvre au niveau du système d'exploitation.
Pour plus de détails, voir
et
Interaction entre les niveaux d'abstraction de l'unité centrale et du système d'exploitation.