Architektura IA-32

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.