Ogólne własności

 

  1. Przenośna dynamiczna translacja

    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.

     

  2. Działa na X86 i PowerPC. Jest testowany na ARM, Sparc32, Alpha i S390

  3. 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.

     

  4. Dokładne wsparcie obsługi błędów

  5. Wirtualny CPU jest biblioteką (libqemu), która może być używana w innych projektach

  6. 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ę.

     

Czym jest QEMU?

spis tresci

Porównanie z innymi emulatorami.