Kstuff-lite
1.11-opt s'appuie sur le crypto, FSELF, NPDRM et le chargeur existants travail. Il réduit les coûts de transition de l'UELF/KELF, rend la manipulation FPU/CR0...
Choisir une liste...
d'une teneur en poids de matières grasses égale ou supérieure à 50 %1.11-opt
1.11-opts'appuie sur le crypto-lite kfood existant, FSELF, NPDRM et chargeur
travail. Il réduit les coûts de transition de l'UELF/KELF, rend la manipulation FPU/CR0 plus sûre et
plus rapide et ajoute des diagnostics opt-in détaillés.
Faits marquants
- Traductions en cache pour les objets du noyau fixe par processeur utilisés sur chaque UELF l'entrée, y compris les cartes qui traversent une limite de segment physique.
- Narrow checked trap-frame et pile lit au lieu de copier le cadre inutilisé Préfixes.
- Une simple transition debug-register restaurer et des instantanés de matériel sauté lorsque le thread actuel ne possède pas de registres de débogage actifs.
- Une chaîne CR0 d'économie/TS-clear validée et sans défaut avec obligatoire gadgets per-kernel et pas d'antécédents de récupération CR0.
- Entrée rapide de CR0 par une suite unique de KELF et restauration différée de CR0 à la sortie finale de KELF.
- Sélection du temps d'exécution entre
XSAVECetXSAVE, avec CPUID/XCR0 unique découverte et validation stricte de la zone de sauvegarde. - Résultats opt-in élargis et paramètres de défaillance grâce à
KSTUFF_OBS=1. - Réutiliser le tuyau de noyau existant du chargeur par prosper0gdb.
Piège UELF et chemins de mémoire du noyau
Lecture de l'image contrôlée étroite
Les gestionnaires de pièges ne lisent maintenant que la partie d'un cadre stocké qu'ils utilisent.
.fpkg,kekcall, et la manipulation des pièges utilitaires utilisent des aides à la copie de queue vérifiées;
Les chemins de boîte aux lettres et de syscall utilisent des lectures et des écrits scalaires vérifiés. Où le retour
adresse est déjà connue, mises à jour de traitement FSELFRSPetRIPdirectement
au lieu de lire à nouveau la même valeur depuis la mémoire du noyau.
Cela réduitvirt2physappels et octets copiés sans affaiblir l'erreur
la manipulation. Un retour de lecture ou d'écriture échouéEFAULTou laisse la demande
chemin de repli normal au lieu de consommer l'état de lecture partielle.
Correction des caches de cartographie
Les objets stables par processeur suivants ont mis en cache des cartes virtuelles à physiques :
- le cadre de piège étendu;
- des
justreturncadre; - le pointeur courant dans
pcpu; TSS.RSP0;- des
wrmsrdomaine d'argumentation; - le CR0 entre et sort des fentes de poursuite.
Le cache peut représenter deux segments physiques, donc un objet traversant une page ou La cartographie des limites n'a pas besoin de retomber sur chaque accès. Initialisation coché, la publication est atomique, et une copie non cochée reste disponible si une cartographie ne peut pas être mise en cache.
L'installation de la table des pages de l'UELF désigne également l'utilisateur, l'auteur, le présent et drapeaux de grande page explicitement. Les entrées de cartes directes ne sont pas globales, en évitant Traductions TLB non sûres lors de la commutation entre le noyau et UELF CR3.
Expédition de la cryptographie
Pendant la classification, la fausse clé est récupérée une fois et transmise au XTS ou
Gestionnaire HMAC. Cela supprime le premierhas_fake_key()recherche suivie d'une
deuxièmeget_fake_key()regarde. XTS et HMAC cache sélection effectue également une
scanner qui enregistre à la fois une entrée correspondante et la première entrée libre.
Les messages non manipulés ou non falsifiés conservent le chemin original du noyau et sont liés les chaînes de message sont toujours traversées correctement. Snapshot lecture échecs sont compte et échoue en toute sécurité.
Transitions des registres de déboguement
La restauration du registre de débogage entre maintenant dans la queue vérifiée du noyau
cpu_switchla mise en oeuvre et la restauration de DR0, DR1, DR2, DR3, DR6 et DR7
transition gadget unique. Chaque disposition du noyau utilise sa propre entrée validée.
Avant d'installer un point de veille, le code vérifiePCB_DBREGS. Si le drapeau est
clair, le thread ne possède pas live hardware debug-register état, donc une impasse
l'instantané matériel est ignoré et l'état sauvegardé est initialisé comme désactivé.
Les drapeaux PCB sont accessibles comme un champ 32 bits, et le retour restaure à la fois l'ancien
les registres et le drapeau de propriété original si l'installation échoue.
KELF 8-octets écrit aussi utiliser un scalairemov [rdi], raxau lieu de
configurationrep movsbpour chaque mise à jour d'un mot q.
Manipulation FPU et CR0
Entrée CR0
UELF crypto utilise les instructions SIMD et doit préserver l'état du noyau FPU pendant
dégagement temporaireCR0.TS. Le chemin d'entrée est un KELF spécifique au noyau
chaîne: elle mono-étapesmov_rax_cr0, capture le résultat#DB, efface TS,
commits la nouvelle valeur, et enregistre les trois états sans délibérément
causant une deuxième faute XSAVE/FXSAVE. Défaut d'armer ou de valider cette chaîne
rapporté directement; il n'y a pas de recul de la capture de CR0.
La chaîne empoisonne et transfère un compact0x60-octet résultat bloc,
puis valide les valeurs enregistrées, effacées et engagées. Une inadéquation restaure
TS si possible et signale un échec au lieu de faire confiance à l'état partiel.
Entrée rapide et restauration différée
UELF arme une suite KELF à un seul coup et effectue une
yield(); KELF réinitialise le crochet avant d'exécuter la chaîne CR0. Cela contourne les
gadget de retour générique. L'adresse de poursuite fixe et
sa cartographie physique est mise en cache après la première utilisation.
AprèsXRSTOR, la restauration CR0 est reportée jusqu'àuelf_fpu_finish(), juste
avant le terminal UELFHLT. KELF restaure ensuite CR0 et continue à travers
la sortie finale normale. Les utilisateurs de FPU imbriqués partagent la paire externe de sauvegarde/restauration, donc
ils n'ajoutent pas de transitions CR0 ou XSAVE supplémentaires.
Sélection du mode XSAVE
La découverte CPUID et XCR0 est effectuée une fois par instance UELF. Avant d'utiliser instruction de sauvegarde architecturale, le code vérifie:
- Le CPUID expose les feuilles
0xD; - le CPU et OS exposent XSAVE/OSXSAVE;
- x87 et SSE sont activés dans XCR0;
- XCR0 ne contient que les composants d'état signalés par le CPUID;
CPUID.(D,0):EBXest dans le minimum architectural, le maximum déclaré, et le tampon local aligné à 4096 octets.
XSAVECest sélectionné lorsqueCPUID.(D,1):EAX[1]la publicité; sinon le code
utilisationsXSAVE. Restaurer toujours les utilisationsXRSTOR.XSAVEOPTn'est pas délibérément utilisé
parce que le tampon de scratch n'est pas garanti pour contenir le même propriétaire
État précédent. Une configuration inutilisable désactive à la place l'entrée FPU
de déborder le tampon ou d'exécuter une instruction non étayée.
success0gdb chargeuse handoff
Le chargeur passe prospère0gdb une structure bootstrap en version contenant son
descripteurs de tubes de lecture/écriture existants et adresse du tube du noyau. prospère0gdb
réutiliser ce primitif au lieu d'affecter et de résoudre un autre tuyau. Les
plus âgévictim_pktoptsABI reste reconnu pour les appelants qui ne fournissent pas
la magie du bootstrap.
Observabilité
Construire avec les métriques et le lecteur de débogage activé:
export PS5_PAYLOAD_SDK=/opt/ps5-payload-sdk
KSTUFF_OBS=1 ./ci-ps5-kstuff-ldr.sh
Une construction normale maintient les compteurs supplémentaires hors des sentiers chauds:
./ci-ps5-kstuff-ldr.sh
Les mesures ajoutées couvrent:
- Les entrées UELF, les pannes de cadre vérifiées et les cycles d'entrée total/max;
- les appels de gadget, les échecs, les réductions de lecture des résultats et les cycles;
- copies scalaires et en vrac du noyau;
- lecture d'instantanés cryptographiques, défaillances et cycles;
- cartographie des succès, des ratés et des retombées;
- debug-registrer lit, écrit, chaînes à simple transition, et sauté les instantanés;
- CR0 bras d'entrée rapide/restauration différée, défaillances, utilisation de caches à crochets, et coût des bras;
- FPU entrée/sortie, XSAVE/XSAVEC/XRSTOR compte, défaillances et coût du cycle.
ps5-kstuff/debug-reader.cimprime ces compteurs de l'observation partagée
zone. Les mesures sont destinées à des parcours de comparaison; elles ajoutent des frais généraux de mesure
et ne devraient pas être utilisés comme numéros de libération-performance.