Tech

Linus Torvalds ajoute une validation rapide de l’accès utilisateur via le masquage d’adresse à Linux 6.12

NOYAU LINUX

Entre la semaine chargée de Linus Torvalds à Vienne pour le Linux Kernel Maintainer Summit et les événements liés à la Linux Foundation, ainsi que la gestion de la fenêtre de fusion de Linux 6.12 avec l’arrivée de nouvelles fonctionnalités comme sched_ext et PREEMPT_RT en temps réel, il a également réussi à terminer une partie de son propre code pour cette prochaine version du noyau. Aujourd’hui, son propre code est fusionné et fonctionne sur un nouveau chemin de validation rapide de l’accès utilisateur utilisant le masquage d’adresse.

Bien qu’il soit rare de nos jours que Linus Torvalds lui-même se mette à coder de nouvelles fonctionnalités brillantes et importantes pour le noyau, dans Linux 6.11 il a élaboré de nouvelles optimisations ARM64 (AArch64) et maintenant pour Linux 6.12 il fait passer cette validation rapide de l’accès utilisateur via la capacité de masquage d’adresse. Au départ, ce nouveau code pour Linux 6.12 ne bénéficie qu’aux processeurs x86_64.

Accès rapide utilisateur

L’explication courte est que ce nouveau code peut permettre de contourner le besoin de certaines barrières de spéculation Spectre V1 et les appels access_ok() désormais coûteux en raison de ces atténuations de Spectre Variant One. Torvalds a expliqué dans l’article d’aujourd’hui Fusion Git:

« Fusionner la validation rapide de l’accès utilisateur à l’aide du masquage d’adresse.

Cela permet aux architectures d’utiliser éventuellement un modèle de masquage d’adresse dépendant des données au lieu d’une branche conditionnelle pour valider les accès des utilisateurs. Cela évite les barrières spéculatives de Spectre-v1.

Actuellement, seules les architectures x86-64 en bénéficient, et toutes les architectures ne pourront pas le faire. Cela nécessite une zone de garde entre les espaces d’adressage utilisateur et noyau (afin d’éviter tout débordement de l’un vers l’autre), et un moyen simple de générer une adresse garantie de défaillance pour les pointeurs utilisateur non valides.

Notez également que cela suppose actuellement qu’il n’y a aucune différence entre les accès en lecture et en écriture des utilisateurs. Si cela est étendu à des architectures comme PowerPC, nous devrons également séparer les cas de lecture et d’écriture des utilisateurs.

Torvalds expliqué plus en détail dans le cadre d’un des patchs :

« Les atténuations de Spectre-v1 ont rendu « access_ok() » beaucoup plus coûteux, car il doit sérialiser l’exécution avec le test pour une adresse utilisateur valide.

Toutes les routines de copie utilisateur normales évitent cela en masquant simplement l’adresse utilisateur avec un masque dépendant des données, mais les modèles rapides de type « unsafe_user_read() » qui étaient censés être un cas rapide ont été ralentis.

Cela introduit une notion d’utilisation

src = début_accès_utilisateur_masqué(src);

pour rendre l’adresse utilisateur saine en utilisant un masque dépendant des données au lieu du masque conditionnel plus traditionnel

si (user_read_access_begin(src, len)) {

modèle.

Ce modèle ne fonctionne que pour les accès denses qui démarrent à « src » et sur les architectures qui ont une région de garde qui est garantie de tomber en panne entre l’espace utilisateur et la zone de l’espace noyau.

Avec cela, l’accès utilisateur n’a pas besoin d’être vérifié manuellement, car une mauvaise adresse est garantie d’être défaillante (par une astuce de masquage d’architecture : sur x86-64, cela consiste simplement à transformer une adresse utilisateur invalide en uns, puisque nous ne mappons pas le haut de l’espace d’adressage).

Cela ne convertit que quelques exemples pour l’instant. Exemple de génération de code x86-64 pour le chargement de deux mots depuis l’espace utilisateur :

stac
déplacer %rax,%rcx
par $0x3f,%rcx
ou %rax,%rcx
mouvement (%rcx),%r13
déplacer 0x8(%rcx),%r14
clac

où toute la gestion des erreurs et -EFAULT est désormais purement gérée hors ligne par le chemin d’exception.

Bien sûr, si la microarchitecture ne fonctionne pas bien avec « clac » et « stac », ce qui précède reste pitoyablement lent. Mais au moins, nous avons fait de notre mieux. »

Cette validation rapide de l’accès utilisateur basée sur le masquage d’adresse est fusionné maintenant pour Linux 6.12 sur x86_64 avec beaucoup d’autres nouveaux codes intéressants à venir cette semaine. La fenêtre de fusion de Linux 6.12 se terminera dans une semaine et culminera avec la sortie de Linux 6.12-rc1.

Source link