Niestety najpopularniejsza obecnie platforma sprzętowa - IA-32 nie jest w naturalny sposób przygotowana do wirtualizacji. Innymi słowy procesory z rodziny x86 nie spełniają założeń sformułowanych przez Gerald J.Popeka i Robert P.Goldberga. Problem polega na "niepoprawnym", w punktu widzenia wymagań wirtualizacji, przetwarzaniu niektórych instrukcji procesora.
Lista niebezpiecznych instrukcji
clts | T |
hlt | T |
in | * |
ins | * |
out | * |
outs | * |
lgdt | T |
lidt | T |
lldt | T |
lmsw | T |
ltr | T |
mov r32, CRx | T |
mov CRx, r32 | T |
mov r32, DRx | T |
mov DRx, r32 | T |
mov r32, TRx | T |
mov TRx, r32 | T |
popf | * |
pushf | * |
cli | T |
sti | T |
sgdt | N |
sidt | N |
sldt | N |
smsw | N |
str | N |
verr | N |
verw | N |
lar | N |
lsl | N |
lds/les/lfs/lgs/lss | * |
mov r/m, Sreg | * |
mov Sreg, r/m | * |
push Sreg | * |
pop Sreg | * |
sysenter | * |
sysexit | T |
Na podstawie artykułu K. Lawtona
Jest to tablica instrukcji procesora, których wywołanie może spowodować błąd w wykonywaniu systemu gościa.
- T oznacza, że instrukcja wywoływana na poziomie Ring 3 generuje przerwanie
- N oznacza, że przerwania nie generuje
- * oznacza, że instrukcja generuje przerwanie w zależności od innych parametrów środowiska
Nie można dopuścić do sytuacji, w której któraś z tych instrukcji zostałaby wykonana przez maszynę wirtualną. W tym celu stosuje się dość zaawansowane techniki powiązane ze śledzeniem wykonywania instrukcji.
Instrukcje skoku
Kolejnymi niebezpiecznymi instrukcjami są instrukcje skoku.
call |
ret |
enter |
leave |
jcc |
jmp |
int/into/bound |
iret |
loop |
loope/z |
loopne/nz |
wait |
Na podstawie artykułu K. Lawtona
Instrukcje mogą spowodować skok do fragmentu kodu, który nie był jeszcze analizowany. Techniki wirtualizacji modyfikują kod programów, które są wykonywane w maszynie wirtualnej, więc instrukcje skoku również muszą być nadzorowane.