Pentium F00F bugg
Pentium F00F-felet är ett designfel i de flesta Intel Pentium- , Pentium MMX- och Pentium OverDrive- processorer (alla i P5-mikroarkitekturen ). Upptäcktes 1997, kan det resultera i att processorn slutar fungera tills datorn fysiskt startas om. Felet har kringgåtts genom uppdateringar av operativsystemet .
Namnet är en förkortning för F0 0F C7 C8
, den hexadecimala kodningen av en felaktig instruktion . Mer formellt kallas felet den ogiltiga operanden med låst CMPXCHG8B-instruktionsfel .
Beskrivning
I x86-arkitekturen representerar bytesekvensen F00F C7 C8
instruktionslåset cmpxchg8b eax
(låst jämförelse och utbyte av 8 byte i register EAX). Felet gäller även opkoder som slutar på C9
till CF
, som anger andra registeroperander än EAX. F0 0F C7 C8-
instruktionen kräver inga speciella privilegier .
Denna instruktionskodning är ogiltig. cmpxchg8b
-instruktionen jämför värdet i EDX- och EAX- registren med ett 8- byte- värde på en minnesplats. I detta fall anges dock ett register istället för en minnesplats, vilket inte är tillåtet.
Under normala omständigheter skulle detta helt enkelt resultera i ett undantag ; men när den används med låsprefixet ( används normalt för att förhindra två processorer från att störa samma minnesplats), använder CPU:n felaktigt låsta busscykler för att läsa den illegala instruktionen undantagshanterare-beskrivningen. Låsta läsningar måste paras med låsta skrivningar, och CPU:ns bussgränssnitt upprätthåller detta genom att förbjuda andra minnesåtkomster tills motsvarande skrivningar inträffar. Eftersom ingen kommer, stoppas all CPU-aktivitet efter att ha utfört dessa busscykler, och CPU:n måste återställas för att återställas.
På grund av spridningen av Intel-mikroprocessorer ansågs förekomsten av denna instruktion med öppna privilegier vara ett allvarligt problem vid den tiden. Operativsystemsleverantörer svarade genom att implementera lösningar som upptäckte tillståndet och förhindrade kraschen. Information om felet dök upp på Internet för första gången den 8 november 1997. Eftersom F00F-felet har blivit allmänt känt används termen ibland för att beskriva liknande hårdvarudesignfel som Cyrix coma bug .
Inga permanenta hårdvaruskador uppstår vid exekvering av F00F-instruktionen på ett sårbart system; den låser sig helt enkelt tills den startas om. Dataförlust av osparade data är dock sannolikt om diskbuffertarna inte har tömts, om enheter avbröts under en skrivoperation eller om någon annan icke- atomär operation avbröts.
MyB2- steppingen löste detta problem för Intels Pentium-processorer.
F00F-instruktionen kan betraktas som ett exempel på en Halt and Catch Fire- instruktion (HCF).
Lösningar
Även om en definitiv lösning på detta problem krävde någon form av hårdvaru-/firmwarerevision, föreslagna lösningar vid den tidpunkten som förhindrade utnyttjandet av detta problem för att generera en överbelastningsattack på den drabbade maskinen. Alla av dem var baserade på att kraftfullt bryta upp mönstret av felaktiga bussaccesser som är ansvariga för processorns hängning. Intels föreslagna (därför "officiella") lösningar krävde att tabellen över avbrottsbeskrivningar sattes upp på ett onaturligt sätt som tvingade processorn att utfärda ett mellanliggande sidfel innan den kunde komma åt minnet som innehåller deskriptorn för undantaget med odefinierad opkod. Dessa främmande minnesåtkomster visade sig vara tillräckliga för att bussgränssnittet skulle släppa låskravet som var grundorsaken till felet.
Specifikt är tabellen med avbrottsdeskriptorer, som normalt finns på en enda minnessida, istället uppdelad på två sidor så att deskriptorerna för de första sju undantagshanterarna finns på en sida, och resten av tabellen på nästa sida. Hanteraren för det odefinierade opcode-undantaget är sedan den sista deskriptorn på första sidan, medan hanteraren för sidfel-undantaget finns på den andra sidan. Den första sidan kan nu göras icke-närvarande (vanligtvis betecknar en sida som har bytts ut till disk för att ge plats åt annan data), vilket kommer att tvinga processorn att hämta deskriptorn för sidfelsundantagshanteraren. Denna beskrivning, som finns på den andra sidan i tabellen, finns i minnet som vanligt (om den inte vore det skulle processorn dubbla - och sedan trippelfela , vilket leder till en avstängning). Dessa extra minnescykler åsidosätter minneslåsningskravet som utfärdats av den ursprungliga olagliga instruktionen (eftersom felaktiga instruktioner är tänkta att kunna startas om efter att undantagshanteraren återvänder). Hanteraren för sidfelundantaget måste dock modifieras för att klara behovet av att tillhandahålla den saknade sidan för den första halvan av avbrottsbeskrivningstabellen, en uppgift som den vanligtvis inte behöver utföra.
Den andra officiella lösningen från Intel föreslog att alla sidor skulle finnas kvar i minnet, men att den första sidan skulle vara skrivskyddad. Eftersom den ursprungliga olagliga instruktionen var tänkt att utfärda en minnesskrivcykel, räcker detta för att återigen tvinga ingripande av sidfelshanteraren. Denna variant har fördelen att de ändringar som krävs av sidfelshanteraren är mycket små jämfört med de som krävs för den första varianten; den behöver i princip bara omdirigera till hanteraren med odefinierade undantag när det är lämpligt. Denna variant kräver dock att själva operativsystemet förhindras från att skriva till skrivskyddade sidor (genom inställningen av en global processorflagga), och alla kärnor är inte utformade på detta sätt; nyare kärnor är det faktiskt, eftersom detta är samma grundläggande mekanism som används för att implementera copy-on-write .
Ytterligare lösningar än de officiella från Intel har föreslagits; i många fall visade sig dessa vara effektiva och mycket lättare att genomföra. Den enklaste innebar att bara markera sidan som innehöll avbrottsbeskrivningar som icke-cachebar. Återigen, de extra minnescyklerna som processorn tvingades gå igenom för att hämta data från RAM varje gång den behövde anropa en undantagshanterare verkade vara allt som behövdes för att förhindra att processorn låste sig. I det här fallet krävdes ingen som helst modifiering av någon undantagshanterare. Och även om det inte är strikt nödvändigt, utfördes samma uppdelning av avbrottsbeskrivningstabellen i det här fallet, med endast den första sidan markerad som icke-cachebar. Detta var av prestandaskäl, eftersom sidan som innehåller de flesta av deskriptorerna (och de som oftare krävs faktiskt) kunde stanna i cachen.
Av okända skäl har dessa ytterligare inofficiella lösningar aldrig godkänts av Intel. Det kan vara så att man misstänkte att de kanske inte skulle fungera med alla berörda processorversioner.
Se även
- CMPXCHG8B
- Denial-of-service attack
- Pentium FDIV bugg
- Meltdown (säkerhetssårbarhet)
- Spectre (säkerhetssårbarhet)
Vidare läsning
- Crothers, Brooke (1997-11-10). "Net reagerar på "F0" Pentium bugg" . CNET Nyheter . Hämtad 2015-07-27 .
- Collins, Robert R. (1998-05-01). "Pentium F00F Bug" . Dr. Dobb's Journal . Hämtad 2015-07-27 .
-
PC World . PC World Communications . 16 : 55. 1998 https://books.google.com/books?id=CEZVAAAAMAAJ . Hämtad 2015-07-27 .
{{ citera journal }}
: Saknas eller är tom|title=
( hjälp )
externa länkar
- Intel Pentium erratum
- Microsoft Knowledge Base-artikel [ död länk ]
- F00F CVE buggpost