Les programmes n’arrêtent pas de faire des requêtes à la mémoire en continu, car ils envoient le matériel non seulement pour traiter les données, les modifier, créer de nouvelles données, éliminer celles existantes, etc. Mais, il y a des sections de mémoire auxquelles si un programme accède, il peut finir par perturber le fonctionnement général du système. Nous appelons cette protection de la mémoire.
À un certain moment de leur évolution, les processeurs ont commencé à implémenter des systèmes de protection de la mémoire qui séparaient l’adressage de la RAM en plusieurs sections. Pour le comprendre, il suffit d’imaginer qu’il existe un quartier à usage exclusif dans une ville et un corps de police qui empêche l’accès audit quartier à ceux qui ne peuvent pas l’utiliser, les citoyens étant privilégiés à utiliser tous les processus du système d’exploitation. .
Pourquoi la protection de la mémoire est-elle nécessaire?
La protection de la mémoire est devenue nécessaire dans les processeurs des PC dès qu’il est devenu nécessaire de créer des environnements multitâches dans lesquels plusieurs programmes partageaient l’accès à la mémoire à différents moments. Les premières années de l’informatique étaient avec des programmes à tâche unique qui exécutaient également la tâche des systèmes d’exploitation eux-mêmes en même temps, en particulier sur les ordinateurs domestiques 8 et 16 bits basés sur les MOS 6502 et Z80A.
Un cas célèbre pour le manque de protection de la mémoire dans le processeur, nous l’avons dans le classique Commodore Amiga, dont les versions basées sur le standard 68K avaient des plantages continus en raison de l’exécution d’un système d’exploitation multitâche sur un processeur sans protection de la mémoire, comme cela s’est produit avec le Apple Macintosh sous le même processeur.
Aujourd’hui, tous les processeurs intègrent une protection de la mémoire, devant exécuter des systèmes d’exploitation multitâches très complexes où le nombre de processus simultanés se chiffre en milliers.
Comment fonctionne la protection de la mémoire?
Dans les processeurs contemporains, la protection de la mémoire est assurée par le même processeur, afin d’éviter les maux de tête aux développeurs. Chaque CPU a stocké dans une série de registres ce que l’on appelle la table des pages, qui est ce qui l’informe de l’organisation de la mémoire système. La table des pages n’est pas seulement utilisée pour traduire les adresses de mémoire virtuelle en mémoire physique, mais également quelle partie de la mémoire est accessible par les applications et laquelle ne l’est pas.
Lorsqu’une application accède à une partie de la mémoire qu’elle n’est pas autorisée à faire, la CPU génère alors une interruption qui donne le contrôle au système d’exploitation. À partir de là, cela dépend de la manière dont la solution a été mise en œuvre au niveau logiciel. Le système d’exploitation peut décider d’arrêter complètement le programme et tous ses processus unilatéralement.
Il faut tenir compte du fait que la table des pages contient non seulement les informations sur l’organisation de la mémoire, ainsi que ses parties d’accès privilégiées, mais également la situation de la RAM à tout moment. Sa gestion est réalisée par un thread noyau du système d’exploitation, qui se charge d’affecter les différentes ressources aux programmes actifs, soit sous forme de runtime CPU, soit sous forme d’accès mémoire.
Programmes de veto
La RAM sous la vision de tous les processeurs actuels est divisée en pages et non en adresses mémoire. Qui sont traduites en adresses de mémoire physique par l’unité de gestion de mémoire. Mais que se passe-t-il lorsqu’une partie d’un programme exécute un accès illégal à la mémoire? Nous avons déjà expliqué le processus, mais pour éviter que le CPU puisse entrer dans une boucle absurde, ce qui est fait est de marquer un bit dans l’adresse virtuelle que le binaire qui est stocké n’est pas un programme mais des données.
De telle sorte que lorsque le CPU revient à ces adresses de mémoire virtuelle, il ne le fait plus comme s’il s’agissait d’un programme, mais comme un ensemble de données qu’il ignore. Évidemment, s’il existe un programme avec une instruction de saut vers cette adresse mémoire, une erreur se produira, mais le code qui tentait d’accéder à la RAM ne sera plus exécuté.
Ce bit sur les processeurs x86 est appelé le bit No-Execute ou NX. Il s’agit d’une mesure de sécurité très simple que le système d’exploitation peut gérer, mais ce n’est pas la seule dont un système d’exploitation dispose pour empêcher l’exécution de code invalide. Bien que le mécanisme de protection ne fonctionne pas toujours et qu’il existe d’autres mécanismes avec lesquels le processeur obscurcit la mémoire protégée vers les applications.
Par exemple, le système d’exploitation s’attribue un bit d’accès exclusif pour tous ses threads. Lorsqu’une application sans ses privilèges se voit attribuer un accès à la RAM protégée en modifiant le bit d’accès, le système d’exploitation rétablit ce bit en manipulant la section qui correspond aux applications dans la table des pages
Comment le CPU obtient-il la table des pages?
Le premier programme à fonctionner sur un PC, quel que soit son format, est le système d’exploitation. Certains systèmes plus complexes chargent un système de prévisualisation qui met le matériel sous tension et transmet le témoin au système d’exploitation de manière déguisée. Ce processus ne dépend pas du matériel, mais tout le matériel a une adresse mémoire là où il commence et à partir de là, il parcourt la mémoire dans un sens ou dans un autre selon qu’il s’agit d’un processeur Big Endian ou Little Endian.
Par conséquent, dans ces adresses mémoire, il doit y avoir les informations pour démarrer le PC, qui est aujourd’hui l’UEFI mais à ses débuts c’était le BIOS. Qui agit comme un acte d’ouverture pour le système d’exploitation. Mais d’où le système d’exploitation tire-t-il la situation de la RAM? Eh bien, il le fait grâce à l’utilisation de deux tables stockées dans le chipset de la carte mère, appelées tables ACPI.
L’ACPI est le premier mécanisme chargé de gérer les accès mémoire des périphériques ainsi que l’organisation de la RAM. Pour ce faire, il fournit deux tables au système d’exploitation qui ont la même fonction. Ces tableaux sont:
- RSDT (tableau des descripteurs de système racine).
- XSDT (Extended Root System Descriptor Table).
Si le système d’exploitation est de 32 bits, il vous donnera le RSDT, s’il est de 64 bits, le XSDT. À partir de là, le système d’exploitation aura déjà tout ce dont il a besoin pour gérer les accès mémoire avec le processeur.
Le système d’exploitation est monarque
Dans l’adressage mémoire, il existe une série de bits que les applications ne peuvent pas utiliser et dont l’accès est totalement interdit. En réalité, les demandes de ressources matérielles ne sont pas faites par les applications elles-mêmes, mais par le système d’exploitation. Aucune application ne peut donc toucher le bit qui désactive l’accès à la mémoire protégée sans l’autorisation du système d’exploitation lui-même.
Cela provoque une série de problèmes d’accès à la mémoire dans les systèmes virtualisés, ce qui conduit à devoir ajouter des bits supplémentaires dans l’adressage de la mémoire virtuelle, ce qui sert à indiquer au CPU un niveau de privilège spécial pour les applications exécutées dans une machine virtuelle .
Pour cela, non seulement le CPU doit être équipé de cette possibilité, mais cela influence également la manière dont le système d’exploitation est organisé. Les systèmes d’exploitation dans le cloud exécutent généralement un hyperviseur, qui est en charge de gérer l’accès à la RAM des différentes machines virtuelles.