Ik vind "lapmiddel" wel een beetje een negatieve connotatie hebben. Het hangt er helemaal van af wat ze nou uiteindelijk als oplossing bedacht hebben. Meltdown is vrij simpel op te lossen met een kleine micro-architectuur aanpassing, maar Spectre variant 2 is veel lastiger.
Ik vraag me dus af wat er bedoeld zal worden met:
Details over de hardwarematige bescherming publiceert Intel nog niet maar duidelijk is dat het bedrijf voor afscherming, het bedrijf spreekt van 'partitionering', zorgt zodat 'afkijken' bij speculatieve verwerking onmogelijk wordt.
Er zijn hier twee dingen die je zou kunnen partitioneren om je te beschermen tegen de informatie lekken van Spectre. Ten eerste zou je je cache kunnen partitioneren, wellicht gebruik makende van de infrastructuur die de
Intel CAT/CMT features je geven. Als je op die manier de side-channel kan uitschakelen ben je opzich behoed, maar het lijkt me niet echt een waterdichte oplossing voor Spectre v2 (dus dat zou ik een lapmiddel vinden, want wellicht zijn er ook andere side-channels mogelijk).
Het andere wat je kan doen, wat wel echt een Spectre v2 oplossing is, is iets wat ik in Januari in het tweede deel van deze reactie hier beschreef:
Squee in 'reviews: Meltdown en Spectre: vraag-en-antwoord' . Het probleem van Spectre v2 is dat er aliasing kan optreden in bepaalde structuren van de branch predictor tussen verschillende programmas. Door een dergelijke aliasing te forceren kan het misbruikt worden en de branch predictor tijdelijk om de tuin worden geleid, wat observeerbaar gedrag oplevert. De meest robuuste oplossing is dus om te voorkomen dat dit soort aliasing uberhaupt kan optreden (bijv door partitionering dus). Deze paritionering zou je op verschillende manieren kunnen implementeren, welke verschillende implementatie kosten en trade-offs zullen hebben. Een ding wat je zou kunnen doen is een proces context ID toevoegen aan elke entry in deze predictor, maar dat zal een behoorlijk dure oplossing zijn en onderdeel moeten zijn van je lookup mechanisme (voor de diehard techneuten; je zou dan een veel bredere CAM nodig hebben, met alle timing/power/area issues die daar bij horen).
Wellicht is Intel tot de conclusie gekomen dat het voldoende is om alleen deze bescherming te hoeven bieden tussen de twee Hyperthreads die op een core draaien, want op dat niveau wordt de branchpredictor informatie gedeeld. Je zou door een enkele bit toe te voegen aan elke entry aan kunnen geven of hij aan HyperThread 0 of 1 toebehoort, wat veel makkelijker te implementeren is dan een volledige context ID. En als Intel het zichzelf nog makkelijker wil maken (weer even terug komend op het woord "partitionering"), dan splitsen ze deze tabel in de predictor simpelweg in twee delen wanneer HyperThreading aan staat, een voor HT 0, en een voor HT 1. Dit zal wellicht een klein negatief effect hebben op performance door de verminderde capaciteit, maar dit voorkomt wel de mogelijkheid dat de ene HyperThread door aliasing te forceren het speculatieve gedrag van de andere HyperThread kan beinvloeden. Dit is wel een goed werkende oplossing dus, maar ook wel een klein beetje een "lapmiddel" vind ik
[Reactie gewijzigd door Squee op 22 juli 2024 18:30]