COMPTOIR
  
register

Intel et AMD ont des (bons) plans pour dépoussiérer la gestion matérielle des interruptions x86

Si jamais l’idée saugrenue vous venait de programmer un système d’exploitation compatible x86, la gestion des interruptions risque de vous donner du fil à retordre, et pas qu’un peu. Héritée des méandres de la rétrocompatibilité avec les anciens 80286, 80386 et 80486 — rétrocompatibilité qui a d’ailleurs mené à des sempiternels conflits entre matériel et logiciel — son principe est en apparence simple : définir les routines que le processeur doit exécuter lorsqu’il est notifié d’un événement, externe ou interne.

 

Parmi les causes d’interruptions se trouvent trois catégories : celles générées par les périphériques — typiquement le clavier ou un timer — le genre de chose qui ne doit surtout pas être ignoré —, celles logicielles (dont les appels système font partie), qui permettent par exemple d’afficher du texte à l’écran lors des étapes suivant immédiatement le boot, et les erreurs internes du CPU, la plus connue étant certainement la Segmentation Fault signalant un accès invalide à la mémoire.

 

cpu interupt beahviour x86

Un schéma simplifié du bouzin, par Alex Dzyoba

 

Pourquoi changer un système qui fonctionne ?

Certes, la programmation du bousin est un enfer, mais dans l’état actuel, les choses fonctionnent (presque), et il est rare de devoir retoucher à cette partie du code étant donnée son ancienneté... Mais vous vous doutez que la technique de l’autruche n’est pas éternelle. En effet, l’implémentation telle qu’elle est aujourd’hui soufre de problèmes structurels majeurs : d’une part, de nombreux choix de design se sont révélés extrêmement malheureux, menant à un code incompréhensible et donc difficile à maintenir et débuger... ce qui a entraîné des inexorables failles de sécurité ; et, d’autre part, les performances qui en découlent sont — de manière assez peu surprenante — mauvaises. Ainsi, que ce soit chez AMD ou Intel, deux projets de coup de balai majeurs sont menés (de front) pour y remédier.

 

Chez AMD, la solution se nomme Supervisor Entry Extension, et consiste à rustiner les comportements problématiques de l’implémentation originelle, en particulier en ce qui concerne les appels système et le problème des exceptions réentrantes (lorsque le CPU rencontre à nouveau une exception du même type dans le code servant, justement, à traiter cette même exception, entraînant potentiellement une boucle infinie). Le code encore en utilisation est donc en partie réutilisable ; néanmoins, la spécification reste un brouillon — datant de février 2021 — contenant encore de nombreuses zones « à définir » : le problème est donc loin d’être réglé.

 

 

Chez Intel, l’approche est plus radicale, et se nomme Flexible Return and Event Delivery (FRED) : on rajoute un bit permettant de désactiver le comportement précédent, le rendant ainsi obsolète. Cette approche induit un coût bien plus élevé en matière de logiciel, mais a l’avantage de pouvoir envoyer aux oubliettes un certain nombre de mécanismes désuets de nos jours, à savoir les Ring 1 et 2 ainsi que les registres de segmentation mémoire (voir paragraphe suivant, vous ne serez pas déçu !). Bien que cette spécification soit plus récente que celle d’AMD (mars), elle reste encore également largement préliminaire.

 

 

Sur RealWorldTech, le père du noyau Linux, Linus Torvalds, s’est exprimé à ce sujet, et — une fois n’est pas coutume — accueille avec bienveillance les deux approches (ce n’est, en fait, pas si étonnant que cela, la communauté des programmeurs bas niveau ayant particulièrement souffert des divers bugs liés aux mauvaises configurations de la table des interruptions). Nous ne résistons par contre pas à la tentation de transcrire son tact habituel, ici à propos des Ring permettant la gestion des privilèges en matériel (aujourd’hui, seuls le Ring 0, mode noyau, et le Ring 3, mode utilisateur, sont en usage) :

 

L’idée générale de « un ring pour les applications, un pour les pilotes de périphériques, et un pour les gouverner tous » n’était juste qu’une fan-fiction horriblement mauvaise de l’œuvre de Tolkien.

 

Ou encore, à propos des segments (un ancien mécanisme permettant le cloisonnement mémoire inter-processus, aujourd’hui supplanté par l’adressage virtuel et les tables des pages, si bien que les registres incriminés, dont le fameux GS, ne servent plus du tout à leur fonction originelle) :

 

Si vous pensez que vous en avez besoin, ou que vous les voulez absolument (mis à part pour une rétrocompatibilité désuète), je vous suggère de réexaminer vos choix de vie.

 

De toute manière, les processeurs équipés ne risquent pas de sortir avant plusieurs années — plutôt cinq ou dix qu’une — autant dire que les communautés impactées ont encore le temps de débattre plus ou moins posément sur l’attitude à adopter ; sachant qu’un support double (ancienne version/version AMD et nouvelle version Intel en parallèle) n’est pas forcément à proscrire, car permettant une transition moins houleuse en matière de compatibilité. Affaire à suivre ! (Source : ZDNet)

Un poil avant ?

Live Twitch • Marathon 24 heures, 2e édition

Un peu plus tard ...

Un 4e niveau de Turbo pour les Rocket série 11900K/KF ?

Les 9 ragots
Les ragots sont actuellement
ouverts à tous, c'est open bar !
par Un #ragoteur connecté embusqué, le Dimanche 21 Mars 2021 à 09h00  
Vous allez voir qu'ils vont nous inventer le processeur single core à fréquence fixe...

Les interruptions fonctionnent selon un modèle d'exécution séquentiel, le principe étant de créer les "time slices" et les prioriser. Effectivement, ça devient n'importe quoi avec des processeurs variables de partout (turbo, exécution dans le désordre/SMT...) et dotés de nombreux cores.
par Nicolas D., le Samedi 20 Mars 2021 à 15h47  
par Vaark, le Samedi 20 Mars 2021 à 12h31
Merci pour les explications !
C'est intéressant de savoir que les gros constructeurs continuent à faire évoluer des archis anciennes pour des questions de rétrocompatibilité. J'imagine qu'ils ne font pas ça pour la beauté du jeu (d'instructions) donc il doit y avoir une vraie demande chez leurs clients pro.
En mode BIOS (ce qui concerne encore quelques mobales), les CPU x86 démarrent tous en mode 8 bits adressage réel, il faut par la suite passer en 16 bits puis directement 64 adressage virtuel (de mémoire) : la rétrocompatibilité est donc parfois carrément forcée... Par exemple, je ne serai pas du tout étonné de voir des morceaux encore écrits en 8 ou 16 bits sur GRUB ou d'autres live-USB type memtest64 juste parce que... le 64 bits peut ne pas servir / être trop complexe à supporter pour ce genre d'application (la gestion des interruptions y étant justement pour quelque chose, à mon avis !).
par m en Alsace, le Vendredi 19 Mars 2021 à 16h37
Comment ça se passe sous ARM? Android et les autres OS n'ont pas à se plaindre de ces IT? Linus ne maudit rien?
Bonne question ; je n'ai jamais eu de programmation système ARM à faire, donc là je n'y connais rien du tout. Il me semble que la chose a été mieux pensée (il faut dire que casser la rétrocompatibilité du jeu d'instruction tout entier doit avoir eu du bon pour corriger des mauvais choix de design, épaulé par l'exemple du x86).
par Vaark, le Samedi 20 Mars 2021 à 12h31  
Merci pour les explications !
C'est intéressant de savoir que les gros constructeurs continuent à faire évoluer des archis anciennes pour des questions de rétrocompatibilité. J'imagine qu'ils ne font pas ça pour la beauté du jeu (d'instructions) donc il doit y avoir une vraie demande chez leurs clients pro.
par Nicolas D., le Samedi 20 Mars 2021 à 11h22
on était même arrivé à booter avec un i7 sur une disquette de démarrage d'OS/2 sans que cela pose un quelconque souci, c'est dire !
Et dire que je n'ai pas réussi à faire booter un W7 sur disque USB... Certains regorgent d'inventivité
par Nicolas D., le Samedi 20 Mars 2021 à 11h22  
par Vaark, le Vendredi 19 Mars 2021 à 21h27
Heureusement que le schéma est simplifié, déjà que je n'y entends rien, je me demande ce que ce serait sinon

Par contre une question qui va sans doute paraître stupide aux gens savants, mais existe-t-il encore, aujourd'hui, du matos qui sort en X86 / 32 bits ?
Genre... Il y a un vrai intérêt à dépoussiérer cet ancêtre parce que beaucoup de programmes reposent encore dessus aujourd'hui, ou on pourrait, plus charitablement, le laisser trépasser ?
Techniquement, tous les x86 ont un mode 32 bits, on était même arrivé à booter avec un i7 sur une disquette de démarrage d'OS/2 sans que cela pose un quelconque souci, c'est dire !
par Roturier, le Samedi 20 Mars 2021 à 11h22  
par Jemporte, le Samedi 20 Mars 2021 à 09h39
Et encore c'est les distrib qui ont abandonné le noyau compilé. Avec un peu de sport on devrait arriver à se compiler un noyaux pour son vieux 486 sans PAE et SSE2...
En espérant que ces modifications n'amènent pas à une casse générale de la rétro-compatibilité y compris logicielle. Pourquoi ? Parce que l'évolution des puissances des PC ne sera plus ce qu'elle était et que beaucoup de programmes évoluent peu. [...]
Les distrib ne font que récupérer le noyau upstream qui lui a bien arrêté le support de x86 sans PAE depuis 2012, certes le noyau est patchable mais c'est un énorme boulot (qui est justement la raison de l'abandon) et à part Redhat qui ne le fera jamais, personne n'a les moyens de maintenir des vieux CPU, et tous les hacks merdeux qui vont avec, de manière pérenne.

J'avais fait un calcul (car ce n'est pas le premier drop), et en me basant sur l'historique des CPU (X86 wikipedia) je voyais que les drops concernaient des architectures sorties depuis au moins 15-20 ans et en plus à l'époque que tu cites où les archis étaient relativement évolutives.

Pour rappel, l'objectif de ce genre de nettoyage est de virer les trucs qui ont un faible rapport présence sur le marché/complexité du code. Donc pas d'inquiétudes, on va encore garder pendant longtemps de vieilles archis utilisées par maximum 10 mecs dans le monde.
par Jemporte, le Samedi 20 Mars 2021 à 09h39  
par Roturier, le Samedi 20 Mars 2021 à 08h24
Ca fait plaisir de lire ce genre d'articles avec un bon niveau technique et les références qui vont avec car j'ai l'impression que la connaissance à ce sujet se perd !

Non mais il faut a minima assurer la maintenance de l'ancien matos bien que le noyau Linux laisse tomber régulièrement de vieilles archis, il y a qq années, ils ont abandonné le support de x86 sans PAE par exemple.
Et encore c'est les distrib qui ont abandonné le noyau compilé. Avec un peu de sport on devrait arriver à se compiler un noyaux pour son vieux 486 sans PAE et SSE2...
En espérant que ces modifications n'amènent pas à une casse générale de la rétro-compatibilité y compris logicielle. Pourquoi ? Parce que l'évolution des puissances des PC ne sera plus ce qu'elle était et que beaucoup de programmes évoluent peu. Et donc un PC de 2018 gonflé à bloc sera encore largement dans le coup en 2025 niveau performances, autant qu'un PC de 2011 avec un 2600k ou un C2Q de 2007 l'ont été (et le sont encore pour un usage non ultime). En comparaison, un 386 est totalement déclassé par rapport à un Pentium II sorti 10 ans plus tard et toujours en mono-core (autour de 50x plus rapide sans compter le manque de virgule flottante sur 386 et l'adressage mémoire commun aux configurations les cartes extension ISA vs PCI/Vesa et les cartes graphiques déjà 3D contre même pas 2D accélérée aux débuts des 386).
par Roturier, le Samedi 20 Mars 2021 à 08h24  
Ca fait plaisir de lire ce genre d'articles avec un bon niveau technique et les références qui vont avec car j'ai l'impression que la connaissance à ce sujet se perd !
par Vaark, le Vendredi 19 Mars 2021 à 21h27
Heureusement que le schéma est simplifié, déjà que je n'y entends rien, je me demande ce que ce serait sinon

Par contre une question qui va sans doute paraître stupide aux gens savants, mais existe-t-il encore, aujourd'hui, du matos qui sort en X86 / 32 bits ?
Genre... Il y a un vrai intérêt à dépoussiérer cet ancêtre parce que beaucoup de programmes reposent encore dessus aujourd'hui, ou on pourrait, plus charitablement, le laisser trépasser ?
Non mais il faut a minima assurer la maintenance de l'ancien matos bien que le noyau Linux laisse tomber régulièrement de vieilles archis, il y a qq années, ils ont abandonné le support de x86 sans PAE par exemple.
par Vaark, le Vendredi 19 Mars 2021 à 21h27  
Heureusement que le schéma est simplifié, déjà que je n'y entends rien, je me demande ce que ce serait sinon

Par contre une question qui va sans doute paraître stupide aux gens savants, mais existe-t-il encore, aujourd'hui, du matos qui sort en X86 / 32 bits ?
Genre... Il y a un vrai intérêt à dépoussiérer cet ancêtre parce que beaucoup de programmes reposent encore dessus aujourd'hui, ou on pourrait, plus charitablement, le laisser trépasser ?
par m en Alsace, le Vendredi 19 Mars 2021 à 16h37  
Chouette article. Très intéressant

Comment ça se passe sous ARM? Android et les autres OS n'ont pas à se plaindre de ces IT? Linus ne maudit rien?