QEMU jest szybkim emulatorem procesora korzystającym z dynamicznego tłumaczenia kodu. QEMU potrafi emulować cały system(przeważnie PC). Umożliwia to uruchomienie kolejnego systemu operacyjnego bez konieczności restartu systemu na którym pracujemy. QEMU do swojego działania nie potrzebuje wprowadzania dodatkowych zmian do środowiska w którym jest uruchamiane -- w szczególności może zostać uruchomiony przez ,,zwykłego użytkownika''. Umożliwia on emulowanie procesora x86. Posiada jednak pewne ograniczenia:
EMU Potrafi również emulować procesory ARP, PowerPC, SPARC.
Binarna dynamiczna translacja polega na tłumaczeniu kodu podczas jego wykonywania. Dzięki temu tłumaczeniu podlegają tylko te instrukcje które zostaną napotkane, tym samym zyskujemy tu na wydajności. Ponadto dynamiczna translacja umożliwia uruchomienie samo modyfikującego się kodu. Minusem jest natomiast duża ilość dodatkowych informacji jaka musimy przechowywać w pamięci oraz wysoce skomplikowany kod zależny od procesora. QEMU używa kilku trików które ułatwiają proces tłumaczenia instrukcji.
Najprostszym z pomysłów jest podzielenie skomplikowanej instrukcji procesora x86 na kilka łatwiejszych instrukcji. Każda z instrukcji jest zaimplementowana jako kawałek kodu napisanego w języku C. Te kawałki kodu(już maszynowego) są odpowiednio ,,składane'' ze sobą i linkowane do ,,object file''.
Samo modyfikujący kod jest ogromnym wyzwaniem dla programistów piszących emulatory. Najprostszym rozwiązaniem tego problemu jest zaznaczanie przetłumaczonych stron w pamięci systemu macierzystego jako read-only. W momencie gdy nastąpi próba zapisu do takiej strony zostanie wygenerowany wyjątek -- to nam umożliwi zaznaczenie danej strony jako ,,dirty'' -- dzięki temu wiemy który fragment kodu trzeba poddać ponownej translacji.
Na początek należy ściągnąć plik z QEMU (`qemu-XXX-i386.tar.gz') i rozpakować go jako root w `/':
su cd / tar zxvf /tmp/qemu-XXX-i386.tar.gz
W tej chwili dostępne są 2 wersje QEMU:
- qemu-fast
wykorzystujący jednostkę zarządzania pamięcią hosta (MMU) do symulacji x86 MMU. Jest ona szybka ale ma pewne ograniczenia: w systemach z 4 GB pamięci nie możemy wykorzystać wszystkich zasobów. Ponadto nie ma oddzielenia pamięci hosta od pamięci emulowanego systemu, a wiec ta dystrybucja nie oferuje bezpieczeństwa.
- qemu
używa programowego MMU. Jest około 2 razy wolniejszy ale nie posiada ograniczeń qemu-fast
. QEMU emuluje następujące urządzenia:
QEMU wykorzystuje PC BIOS z projektu Bochs i the Plex86/Bochs LGPL VGA BIOS.
ściągnij i rozpakuj (`linux.img') po czym wpisz:
qemu linux.img
Linux powinien się zabootować i pokazać znak zachęty.
Jak widać QEMU od wersji 0.6.1 obsługuje obrazy dysków(skompresowane bądź nie), w tym również obrazy mogące zmieniać swój rozmiar.
Można zmusić QEMU aby używał obrazów dysków jedynie w trybie read-only(opcja ,,-snapshot'') -- wtedy QEMU tworzy dodatkowy plik (z reguły w katalogu ,,/tmp'') w którym zapisuje zmiany nanoszone na system plików. Istnieje możliwość naniesienie zmian z pliku tymczasowego do obrazu dysku, jednak nie jest to opcja samego emulatora.
QEMU może symulować do 6 kart sieciowych. Aby taka symulacja była użyteczna musi być wspierana przez hosta. Oznacza to konieczność ściągnięcia dodatkowego pakietu(dla linuxa), który stworzy nam wirtualne urządzenia symulujące karty sieciowe. Konieczne jest również wkompilowanie w jądro obsługi sieciowych interfejsów TUN/TAP.
Bochs jest open sourcowym emulatorem linii procesorów IA-32 (x86) napisanym pod C++, który pracuje pod ,,większością popularnych platform''. Umożliwia symulacje takich procesorów jak 386, 486, Pentium, PentiumPro AMD64, wspiera obsługę rozszerzeń MMX, SSE, SSE2 i 3DNow.
Ponieważ obecnie najpopularniejsza jest platforma x86 najważniejsza jest dla nas możliwość przetestowania naszych programów dla rożnych procesorów z tej linii. Tu zdecydowanie przewaga leży po stronie emulatora Bochs.
Postanowiłem uruchomić system ReactOS pod obydwoma emulatorami. Jest to open sourcowy klon Windows NT.
Są to jednak bardzo subiektywne wyniki gdyż obrazy z ReactOS dla każdego emulatora zostały przygotowane przez twórców systemu i nie mogę zagwarantować iż ReactOS był identycznie skonfigurowany.