Jak se tohoto problému zbavit. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= I just found the last bug. Pokud se teď těšíte, jak budete pomocí malého prográmku z předchozího článku otravovat sysopy, musím vás zklamat. Nové verze Linuxu už obsahují kód, který tuto chybu odstraní. Nejdříve je nutné se zamyslet, co se asi stalo. Není to příliš jasné. Jedna z teorií je asi následující: instrukce cmpxchg změnila během vývoje svůj opcode. Opcode používaný ve starých 486 kolidoval z nejakým starým software a tak se opcod změnil. Navíc instrukce cmpxchg bere jako vstup pouze adresu a z té toho čte neobvykle mnoho. Proto pentium narazí na podivnou intrukci - cmpxchg8b použitou s registrem, pokusí se tedy vyvolat Invalid instruction, ale protože je tam lock (který by sám o sobě nevadil) a navíc ale se stalo něco špatného v CPU (což o jecho architektuře nevěstí nic dobrého), nepovede se a pentium zamrzne. Tato buga se vstahuje na všechny procerory Pentium a Pentium MMX. Pentium II a PeniumPro už ji nemají. Intel, který do minulého týdne o této chybě nevěděl (alespoň to říká), nebude procesory vyměňovat. Odvolává se na větu ve svých specifikacích, že jejich procesory nemusí těmto specifikacím odpovídat (tato věta tam byla přidána kvůli slavné FDIV buze). A jaké je tedy řešení? Celkem jednoduché. Prostě posunete IDT tak, aby bylo na rozhraní dvou stránek asi takto: +--------------------+ | | ... | | | | ... | | | | Page fault | | | | ... | | +----+--------------------+----+ | |Invalid instruction | | | | ... | | | | ... | | +--------------------+ Tu spodní stránku potom odmapujete. A věc pak funguje asi takto: Pentium narazí na naši instrukci neintrukci a spustí sebedestrukční sekvenci. Dostane se na volání Invalid instruction, ale IDT je pryč, vyvolá se tedy Page Fault (to kupodivu funguje), handler tam potom zjistí, že procesor chtěl šahat na IDT a vyvolá handler sám. To sice přináší zpomalení u přerušení po Invalid instruction (musí se tahat přes Page fault) ale protože tam jsou hlavně věci jako Bus error apod, ani to moc nevadí, že program spadne o několik mikrosekund později.... a tak to celkem funguje. Jednoduše řečeno - pokud vám někdo podrazí nohu, nastavíte druhou Nové verze Linuxu tento workaround už obsahují. výheň