QEMU jest dynamicznym translatorem. Kiedy po raz pierwszy napotka kawałek
kodu, przekształca go na zbiór instrukcji hosta. Zazwyczaj dynamiczne
translatory są bardzo skomplikowane i zależne od CPU. Jednak QEMU używa
kilka sztuczek, które powodują że jest przenośny i prosty, osiągając
przy tym niezłą wydajność.
Podstawowa idea polega na dzieleniu każdej instrukcji z X86 na mniejsze i
prostsze instrukcje. Każda prostsza instrukcja jest implementowana przez
kawałek kodu w C. Wówczas narzędzia kompilacji ('dyngen') budują
dynamiczny kod łącząc odpowiednie proste instrukcje w funkcje.
Działa na X86 i PowerPC. Jest testowany na ARM, Sparc32, Alpha i S390
Mechanizm samomodyfikowania kodu i unieważnienia przetłumaczonego kodu
Kod samomodyfikujący jest specjalnym wyzwaniem w emulacjach X86 ponieważ
żadne unieważnienie cache'u instrukcji nie jest sygnalizowane przez
aplikacje gdy kod jest modyfikowany.
Kiedy kod jest generowany dla podstawowego bloku odpowiednie strony hosta są
chronione przed zapisem chyba że już są ustawione tylko do odczytu (za
pomocą wywołania systemowego mprotect()). Wówczas, gdy następuje próba
zapisu na stronie, Linuks podnosi sygnał SEGV. QEMU unieważnia cały przetłumaczony
kod na stronie i umożliwia zapisywanie na niej.
Poprawne unieważnianie przetłumaczonego kodu jest wykonywane efektywnie
poprzez utrzymywanie połączonej listy wszystkich tłumaczonych bloków
znajdujących się na danej stronie.
Poza tym QEMU unieważnia również strony z przetłumaczonym kodem kiedy
zauważy ze mapowanie pamięci jest modyfikowane przez mmap() lub munmap().
Kiedy używane jest oprogramowanie MMU unieważnianie kodu jest bardziej
efektywne: jeśli dany kod strony jest unieważniany zbyt często z powodu
próby zapisu to budowana jest bitmapa reprezentująca cały kod wewnątrz
strony. Każdy zapis na tę stronę sprawdza bitmapę żeby przekonać się
czy kod rzeczywiście musi być unieważniony. To zapobiega unieważnianiu
kodu jeżeli tylko dane są modyfikowane na stronie.
Dokładne wsparcie obsługi błędów
Wirtualny CPU jest biblioteką (libqemu), która może być używana w
innych projektach
Emulacja MMU
Dla emulacji systemu, QEMU używa wywołania systemowego mmap(), żeby
emulować MMU docelowego CPU. To działa dopóki emulowany system nie używa
obszaru zarezerwowanego przez hosta SO (jak obszar powyżej 0xc0000000 w x86
Linux).
Żeby być w stanie uruchomić jakiś system, QEMU także udostępnia MMU w
oprogramowaniu. W tym trybie, translacja MMU wirtualnego na fizyczny adres
jest wykonywana przy każdym dostępie do pamięci. QEMU używa cache'u tłumaczenia
adresów żeby przyspieszyć translację.