Энтузиасты выпустили новую версию эмулятора Qemu процессорной архитектуры Эльбрус-2000 (e2k)

Запуск кода Hello world в эмуляторе
Запуск кода Hello world в эмуляторе

Основные нововведения версии qemu-e2k-v8.1.3:

  • Переход с 7-й версии QEMU на 8-ю версию.
  • Добавлено много проверок, которые до этого пропускались из-за чего код мог работать в эмуляторе, но падал бы на реальной машине.
  • Выполнен переход на Int128 для передачи параметров в «функции помощники». Существенно упростило сопровождение связанного кода.
  • Поддержка диагностических тегов в предикатных регистрах. Может случайно «ронять» программу если включить теги, т.к. не все варианты взаимодействия реализованы/известны. Будет улучшаться со временем по мере выявления таких мест.
  • Эмулятор начал «отравлять» результаты с включенными тегами.
  • Повышена скорость работы. Производительность выросла более чем на 40%. С включенными тегами на 10-15% быстрее.
  • e2k-linux-gdb пока работает нестабильно. Но планируется исправить в будущем.
  • rustc с тегами ещё не работает.
  • Системная эмуляция всё ещё не реализована.

Большая часть тестов с прошлой ветки проходит. Остальные тесты пока пропускаются:

Ok: 91 Expected Fail: 74 Fail: 0 Unexpected Pass: 0 Skipped: 17 Timeout: 0

Однопоточный тест производительности Coremark на предыдущей версии Qemu-e2k

qemu-e2k-old ./coremark_static_O3_ffast 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 16789 Total time (secs): 16.789000 Iterations/Sec : 178.688427 Iterations : 3000 Compiler version : GCC9.3 Compiler flags : O3 Memory location : Please put data memory location here (e.g. code in flash, data on heap etc) seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xcc42 Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 178.688427 / GCC9.3 O3 / Heap

Однопоточный тест производительности Coremark на текущей версии Qemu-e2k

qemu-e2k-new ./coremark_static_O3_ffast 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 15725 Total time (secs): 15.725000 Iterations/Sec : 254.372019 Iterations : 4000 Compiler version : GCC9.3 Compiler flags : O3 Memory location : Please put data memory location here (e.g. code in flash, data on heap etc) seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0x65c5 Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 254.372019 / GCC9.3 O3 / Heap

Однопоточный тест производительности Coremark на реальной машине с процессором Эльбрус-8С 1200 МГц

./coremark_static_O3_ffast 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 17575 Total time (secs): 17.575000 Iterations/Sec : 3413.940256 Iterations : 60000 Compiler version : GCC9.3 Compiler flags : O3 Memory location : Please put data memory location here (e.g. code in flash, data on heap etc) seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xbd59 Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 3413.940256 / GCC9.3 O3 / Heap

Инструкция по сборке Qemu-e2k

$ git clone --depth=1 -b e2k https://git.mentality.rip/OpenE2K/qemu-e2k.git $ cd qemu-e2k $ mkdir build $ cd build $ ../configure --target-list=e2k-linux-user --static --disable-capstone --disable-werror $ nice ninja $ sudo cp qemu-e2k /usr/local/bin $ cat hello.c #include <stdio.h> int main(int argc, char *argv[]) { const char *name = argc > 1 ? argv[1] : "world"; printf("Hello, %s!\n", name); return 0; } $ lcc -O2 hello.c -o hello-e2k $ qemu-e2k hello-e2k $USER Hello, denis! # setup binfmt $ cat /etc/binfmt.d/qemu-e2k.conf :qemu-e2k:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xaf\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k:OC :qemu-e2k-old:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x31\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k:OC :qemu-e2k32:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xaf\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k32:OC :qemu-e2k32-old:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x31\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k32:OC $ ./hello-e2k $USER Hello, denis!

Эмулятор позволяет запускать приложения e2k (Эльбрус-2000) на машине x86-64 c операционной системой Linux.

Подробнее в Телеграм-каналах

1616
5 комментариев

Кайфуха. Меня такие релизы мотивируют самому пробовать

2

Попробуйте, но требуются навыки работы в дистрибутивах Linux (можно WSL), умение компилировать код. А если хотите портировать, то там нужны глубокие знания C, двоичной трансляции, низкоуровневого программирования (в т. ч. самому разобраться в ассемблере Эльбруса без документации).

1