Linuxov� noviny | Prosinec 1997 | |||||
| ||||||
V p�edchoz�m ��sle Linuxov�ch novin byla uve�ejn�na zpr�va o tom, �e byla objevena nov� chyba v procesorech Intel Pentium. Tato chyba umo��uje b�n�mu u�ivateli zablokovat procesor tak, �e je nutno prov�st studen� start po��ta�e. T�to chyb� se za�alo ��kat "F00F bug" podle hodnoty prvn�ch dvou bajt� chybn� instrukce. Dnes je situace podstatn� lep��. Existuje zp�sob, jak softwarov� danou chybu odst�nit. Stoj� za pov�imnut�, �e k dne�n�mu dni (21. listopadu 1997) byla podle str�nky spole�nosti Intel http://support.intel.com/support/processors/pentium/ppiie/software.htm k dispozici softwarov� z�plata pouze pro Linux a BSDI. (Hovo��m zde o syst�mech s jejich� v�voj��i Intel spolupracoval. Z ostatn�ch syst�m� m� softwarovou z�platu na tuto chybu nap��klad FreeBSD. Na uveden� str�nce jsou zmi�ov�ny tyto syst�my nebo tito v�robci: BSDI, IBM, Linux, Microsoft, NCR, Novell, SCO, Sequent, SunSoft a Unisys.) Ostatn� syst�my v�etn� nap��klad Solarisu a SCO UNIXu maj� p��slu�nou z�platu pouze "ve st�diu v�voje" nebo "test�". Je zaj�mav�, co se zde p��e o opera�n�ch syst�mech Microsoftu:
Tedy Microsoft se z�ejm� vzdal my�lenky na to, �e by jeho opera�n� syst�my mohly b�t n�kdy nasazeny ve v�ceu�ivatelsk�m prost�ed�. Nyn� se budu v�novat mechanismu, jak�m chybn� instrukce pravd�podobn� pracuje a navrhovan�m softwarov�m �e�en�m. Samoz�ejm� nen� v sil�ch jednoho �lov�ka pochopit mili�ny tranzistor� v Pentiu, ale z chov�n� CPU p�i t�to chyb� lze leccos odpozorovat. Popisovan� mechanismy se tedy sna�� odhadnout, co se v CPU p�ibli�n� d�je p�i v�skytu t�to instrukce. Nekladu si ��dn� n�roky na spr�vnost n��e uveden�ch mechanism�, nicm�n� s jejich vyu�it�m se poda�ilo chybu izolovat a odst�nit. Inkriminovanou instrukci s opera�n�m k�dem f0 0f c7 by bylo mo�n� zapsat jako lock cmpxchg8b s adresovac�m m�dem, kter� nen� pro tuto instrukci platn�. Tato instrukce je "t�m�� leg�ln�". Co to znamen�? Na to, �e jde o neplatnou instrukci, a �e by se tedy m�la vyvolat p��slu�n� v�jimka, procesor p�ijde a� pom�rn� pozd�, kdy� u� je prov�d�n� instrukce uvnit� CPU v pokro�il�m stavu. Tento stav se vyzna�uje t�m, �e procesor u� zamknul datovou sb�rnici, jak mu p�ikazuje instruk�n� prefix lock. A zde pr�v� nast�v� probl�m. Procesor zjist�, �e instrukce je neplatn�, a chce vyvolat p��slu�n� p�eru�en�. Toto v prvn� �ad� znamen� pod�vat se do tabulky p�eru�en� (IDT, Interrupt Description Table), na kter� adrese za��n� obsluha p�eru�en� "neplatn� instrukce". Pokus o p��stup k IDT ale sel�e, proto�e CPU m� zam�enou sb�rnici! N�kde v tomto m�st� se procesor zastav�. Jak takovouto chybu o�et�it? K p��stupu na sb�rnici nedoch�z�, pokud se p��slu�n� ��st IDT pr�v� nach�z� v prim�rn� cache procesoru. Prvn� a nejstar�� softwarov� z�platy na tuto chybu fungovaly tak, �e zajistily, aby se v cache objevil ovlada� pro obsluhu v�jimky "neplatn� instrukce" (nap��klad vykon�n�m n�jak� skute�n� neplatn� instrukce), a pak zamkly obsah cache. Toto fungovalo, ale v�kon procesoru bez prim�rn� cache klesl a� n�kam k pr�m�rn�m procesor�m 486. Pozd�j�� �pravy vyu��valy toho, �e jin� v�jimky maj� obsluhu zam�en� sb�rnice vy�e�eny l�pe ne� v�jimka "neplatn� instrukce". Pokud se nap��klad str�nka IDT, ve kter� byl vektor p�eru�en� "neplatn� instrukce", nenach�z� v opera�n� pam�ti, Pentium toto rozpozn� a vyvol� v�jimku ��slo 8 - "dvojit� v�padek" (double fault). Jak tohoto ale dos�hnout? Sta�� zarovnat za��tek IDT tak, aby prvn�ch sedm polo�ek IDT (pro v�jimky 0 a� 6, p�i�em� "neplatn� instrukce" m� ��slo 6) bylo v jedn� str�nce a ostatn� byly v n�sleduj�c� str�nce pam�ti. Tedy aby tabulka IDT za��nala t�sn� p�ed koncem str�nky. D�le je nutno upravit obsluhu v�jimky ��slo 8 tak, aby byla schopna analyzovat situaci a p��padn� zavolat v�jimky ��slo 0 a� 6. A posledn� v�c je ozna�it prvn� str�nku IDT jako neplatnou. V p��pad� pokusu o vykon�n� neplatn� instrukce se tedy zavol� v�jimka ��slo 8 "dvojit� v�padek", kter� pak zp�tn� zjist� o co jde a zavol� p��slu�nou v�jimku z intervalu 0 a� 6. Toto m��e ud�lat dv�ma zp�soby. Bu�to zjist� p��slu�nou informaci z chybov�ho slova a pak zavol� p��slu�nou obsluhu jako funkci (co� byl zp�sob, jak�m byla situace �e�ena v Linuxu) nebo se prvn� str�nka IDT namapuje do pam�ti a dan� instrukce se restartuje (samoz�ejm� a� po kontrole, jestli n�hodou ne�lo o instrukci f0 0f c7 cx. Toto byl zp�sob, jak�m doporu�oval chybu izolovat Intel. Prvn� zp�sob m�l probl�my s obsluhou speci�ln�ch p��pad�, jako je nap��klad lad�c� bod na m�st� neplatn� instrukce a podobn�. Lad�c� a krokovac� funkce zde nefungovaly �pln� korektn�. Naproti tomu druh� zp�sob (navrhovan� Intelem) m�l probl�my se samomodifikuj�c�m se k�dem (nap��klad na SMP stroji - dojde k p�eru�en�, namapuje se IDT, ale n�kdo jin� zm�n� zat�m instrukci, na kter� do�lo k p�eru�en� na f0 0f c7 cx. Restartuje se instrukce, ale IDT je namapovan� a procesor se zablokuje). Linus Torvalds napsal na linux-kernel
Obslou�en� chyby F00F jedn�m ze dvou v��e popsan�ch zp�sob� st�lo p�ibli�n� 55 takt� p�i vyvol�n� kter�koli z v�jimek 0 a� 6. Z�platy proveden� t�mto zp�sobem se objevily v Linuxu 2.0.32 (vlastn� ji� v pre-2.0.32-4) a 2.1.63. Jak je vid�t, odstran�n� takov�to chyby popisovan�m zp�sobem nebylo nijak trivi�ln�. Na�t�st� Linus ve spolupr�ci s Intelem vymyslel je�t� lep�� mechanismus odst�n�n� chyby. V CPU se toti� v pr�b�hu vyvol�n� v�jimky pro neplatnou instrukci nejen neresetuje zam�en� sb�rnice, ale tak� n�sleduj�c� p��stup do pam�ti se prov�d� jako read-write p�esn� tak, jak by jej prov�d�la skute�n� instrukce lock cmpxchg8b. Tak�e pokud je IDT namapov�na pouze pro �ten�, dojde k zavol�n� v�jimky "poru�en� ochrany pam�ti". P��slu�n� obslu�n� rutina pak zjist�, �e byl proveden pokus o z�pis do IDT na polo�ku ��slo 6 a detekuje tak jednozna�n� pokus o zneu�it� chyby F00F.
T�mto zp�sobem se kompletn� odst�n� chyba F00F a nav�c tato z�plata nem� ��dn� vliv na v�kon syst�mu (na rozd�l od p�edchoz�ch �e�en�). V sou�asn� dob� je k dispozici z�plata na j�dro 2.0.32 i 2.1.x, vyu��vaj�c� tohoto mechanismu. Opera�n� syst�m Linux byl jedn�m z prvn�ch, kter� m�ly k dispozici z�platu na hardwarovou chybu Pentia. Tato chyba pro sou�asn� Linux ji� nep�edstavuje ��dn� nebezpe��. |