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.