Obrany schemat wirtualizacji, wkład pracy poświęcony przygotowaniu oprogramowania służącemu wirtualizacji zależy od określonego systemu operacyjnego, budowy procesora i wielu różnych innych czynników.
Najkorzystniejszą sytuacją jest organizacja niektórych środowisk systemów operacyjnych, gdzie niskopoziomowe żądania nie odwołują się bezpośrednio do składowych systemu lecz obsługiwane są poprzez pewien mikro system, który kontroluje wszystkie urządzenia.
W rzeczywistości jednak wymagania te nie są spełniane. Konieczne jest wykrywanie odwołań aplikacji sięgających składowych systemu i odpowiednie ich emulowanie.
Procesor może być zaprojektowany w taki sposób, by zgłaszał przerwanie przy każdej instrukcji sięgającej do składowych systemu (na przykład przy próbie zapisu lub odczytu do rejestrów systemowych). Dawałoby to szansę wirtualnemu monitorowi na odpowiednią emulację tej funkcji.
Niestety nie wszystkie architektury mają taką własność. Na przykład w przypadku x86 istnieje szereg instrukcji, gdzie zapis do rejestrów systemowych jest zabroniony, lecz próba odczytu nie kończy się przerwaniem i przez to jest niemożliwa do wykrycia. Jednakże można wymusić na procesorze, by zgłaszał przerwanie w chwili wywołania funkcji, która wymagają emulacji.
Pierwszym krokiem jest ustalenie, że gościnny kod będzie wykonywał się na poziomie trzecim uprzywilejowania. Szansa na przejęcie kontroli przez monitor maszyny wirtualnej po wywołaniu instrukcji wymagającej emulacji jest największa, gdy program wykonuje się trybie użytkownika.
Wykrycie pozostałych sprawiających problem instrukcji wymaga wsparcia ze strony oprogramowania. Można zastosować technikę dynamicznego skanowania kodu przed jego wykonaniem.