vak: (Default)
[personal profile] vak
QEMU известен как эмулятор компьютеров с различной архитектурой: i386, ARM, MIPS, PowerPC, SPARC. Его ценят за то, что он очень "быстрый". На мало кто знает, что суть QEMU в другом: это "бинарный транслятор". Он делит бинарный код эмулируемой программы на линейные участки - "блоки", разделённые командами переходов. Каждый блок транслируется в систему команд хост-процессора. Затем полученный код выполняется.

Для архитектуры MIPS эмулятор QEMU поддерживает четыре платформы: MIPS Jazz, MIPS Malta, MIPSsim и MIPS 4k (коротенький обзор здесь). Две первые - реальные компьютеры, две вторые - виртуальные системы. Я сделал простейший пример типа "Hello World" для запуска на платформе MIPS 4k. Исходники, бинарники и скрипты запуска можно взять здесь. Запуск эмулятора делается командой "qemu-system-mipsel -M mips -L . -bios hello.bin".

Дизассемблированный код программы находится в файле hello.dis. В файле протокола qemu.log можно посмотреть, как QEMU делит код на блоки и транслирует в команды i386. Метками "IN:" помечены блоки кода MIPS, метками "OP:" - операции виртуальной машины, полученные из исходного кода. Метки "OUT:" - готовый к выполнению код i386.

Всего в программе было 113 команд MIPS. После трансляции образовалось 894 команды i386. Делаем грубую оценку: при запуске QEMU на Pentium 3 ГГц скорость выполнения будет соответствовать процессору MIPS с частотой 3*113/894 = 380 МГц.