v86 эмулирует процессор и оборудование, совместимые с x86. Во время выполнения машинный код преобразуется в модули WebAssembly для достижения приемлемой производительности. Вот список эмулируемого оборудования:
- Процессор, совместимый с x86. Набор команд соответствует уровню Pentium 4, включая полную поддержку SSE3. Отсутствуют некоторые функции, в частности:
- Таскгейты, дальние вызовы в защищённом режиме.
- Некоторые функции 16-битного защищённого режима.
- Пошаговое выполнение (флаг трапа, регистры отладки).
- Некоторые исключения, особенно связанные с плавающей точкой и SSE.
- Многоядерность.
- 64-битные расширения.
- Модуль с плавающей запятой (FPU). Расчёты выполняются с использованием библиотеки Berkeley SoftFloat и должны быть точными (но медленными). Тригонометрические и логарифмические функции эмулируются с помощью 64-разрядных чисел с плавающей запятой и могут быть менее точными. Поддерживаются не все исключения FPU.
- Контроллер гибких дисков (8272A).
- Контроллер клавиатуры PS/2 (8042). С поддержкой мыши.
- Программируемый интервальный таймер (PIT) 8254.
- Программируемый контроллер прерываний (PIC) 8259.
- Частичная поддержка APIC.
- Часы реального времени (RTC) CMOS.
- Универсальная видеокарта с поддержкой SVGA и расширениями Bochs VBE.
- Шина PCI. Частично неполная и используется не каждым устройством.
- IDE-контроллер диска.
- Сетевая карта NE2000 (RTL8390) PCI.
- Файловая система VirtIO.
- Звуковая карта SoundBlaster 16.
Демоверсии
9front —
Arch Linux —
Android-x86 1.6-r2 —
Android-x86 4.4-r2 —
BasicLinux —
Buildroot Linux —
Damn Small Linux —
ELKS —
FreeDOS —
FreeBSD —
FiwixOS —
Haiku —
SkiffOS —
ReactOS —
Windows 2000 —
Windows 98 —
Windows 95 —
Windows 1.01 —
MS-DOS 6.22 —
OpenBSD —
Oberon —
KolibriOS —
SkiftOS —
QNX
Документация
Как это работает —
Сетевое взаимодействие —
Настройка Alpine Linux в качестве гостевой ОС —
Настройка Arch Linux в качестве гостевой ОС —
Настройка Windows 2000/XP в качестве гостевой ОС —
Файловая система 9p —
Linux rootfs на 9p —
Профилирование —
Снижение нагрузки на ЦП
Совместимость
Вот обзор операционных систем, поддерживаемых в v86:
- Linux работает довольно хорошо. 64-битные ядра не поддерживаются.
- Работает Damn Small Linux (ядро 2.4.31).
- Работает Fedora 30.
- Работают все протестированные версии TinyCore.
-
Buildroot можно использовать для создания минимальной сборки. humphd/browser-vm и darin755/browser-buildroot содержат полезные скрипты для сборки.
-
SkiffOS (основана на Buildroot) может кросс-компилировать пользовательскую сборку.
- Archlinux работает. См. archlinux.md для создания образа.
- Debian работает.
- Ubuntu работает до последней версии, которая поддерживала i386 (16.04 LTS или 18.04 LTS для некоторых вариантов).
- Alpine Linux работает. Образ можно создать из Dockerfile, см. Перевод текста на русский язык:
tools/docker/alpine/
- ReactOS работает.
- FreeDOS, Windows 1.01 и MS-DOS работают очень хорошо.
- KolibriOS работает.
- Haiku работает.
- Android-x86 был протестирован до версии 4.4-r2.
- Windows 1, 3.x, 95, 98, ME, NT и 2000 работают достаточно хорошо.
- В Windows 2000 и выше тип ПК должен быть изменён с ACPI PC на Standard PC.
- Есть некоторые известные проблемы с загрузкой (#250, #433, #507, #555, #620, #645).
- Windows XP, Vista и 8 работают при определённых условиях (см. #86, #208).
- Многие хобби-операционные системы работают.
- 9front работает.
- Plan 9 не работает.
- QNX работает.
- OS/2 не работает.
- FreeBSD работает.
- OpenBSD работает с определённой конфигурацией загрузки. На приглашении
boot>
введите boot -c
, затем на приглашении UKC>
отключите mpbios
и выйдите.
- NetBSD работает только с пользовательским ядром, см. #350.
- SerenityOS работает (только 32-битные версии).
-
SkiftOS работает.
Вы можете получить некоторую информацию о дисках здесь: https://github.com/copy/images.
Как собрать, запустить и встроить?
Вам потребуется:
- make;
- Rust с целью wasm32-unknown-unknown;
- Версия clang, совместимая с Rust;
- java (для Closure Compiler, не требуется при использовании
debug.html
);
- nodejs (требуется последняя версия, известна работа с версией 16.11.1);
- Для запуска тестов: nasm, gdb, qemu-system, gcc, libc-i386 и rustfmt.
См. tools/docker/test-image/Dockerfile для полной настройки на Debian или WSL (https://docs.microsoft.com/en-us/windows/wsl/install).
- Запустите
make
, чтобы собрать отладочную версию (в debug.html
).
- Запустите
make all
, чтобы собрать оптимизированную версию (в index.html
).
- Образы дисков и ROM загружаются через XHR, поэтому если вы хотите попробовать
index.html
локально, убедитесь, что вы обслуживаете его с локального веб-сервера. Вы можете использовать make run
, чтобы обслуживать файлы с помощью модуля Python http.
- Если вы хотите только встроить v86 в веб-страницу, вы можете использовать libv86.js. Для использования ознакомьтесь с примерами (examples/). Вы можете скачать его из раздела релизов.
Альтернативно, для сборки с использованием docker
- Если у вас установлен docker, вы можете запустить всю систему внутри контейнера.
- См.
tools/docker/exec
, чтобы найти Dockerfile, необходимый для этого.
- Вы можете запустить
docker build -f tools/docker/exec/Dockerfile -t v86:alpine-3.19 .
из корневого каталога, чтобы создать образ docker.
- Затем вы можете просто запустить
docker run -it -p 8000:8000 v86:alpine-3.19
, чтобы запустить сервер.
- Проверьте
localhost:8000
для размещённого сервера.
Запуск через Devcontainer
- Если вы используете IDE, поддерживающую Devcontainers, такую как Github Codespaces, VSCode Remote Container extension или, возможно, другие, такие как Jetbrains IDEA, вы можете настроить среду разработки в контейнере Dev.
- Следуйте инструкциям вашей среды разработки, чтобы настроить контейнер.
- Выполните задачу «Получить образы» для загрузки образов для тестирования.
Тестирование
Образы дисков для тестирования не включены в этот репозиторий. Вы можете загрузить их непосредственно с веб-сайта, используя:
wget -P images/ https://k.copy.sh/{linux3.iso,linux.iso,linux4.iso,buildroot-bzimage.bin,openbsd-floppy.img,kolibri.img,windows101.img,os8.img,freedos722.img}
Запустите интеграционные тесты: make tests
.
Запустите все тесты: make jshint rustfmt kvm-unit-test nasmtests nasmtests-force-jit expect-tests jitpagingtests qemutests rust-test tests
.
Подробнее см. в tests/Readme.md.
Примеры API
- Базовый (examples/basic.html).
- Программно с использованием последовательного терминала (examples/serial.html).
- Интерпретатор Lua (examples/lua.html).
- Два экземпляра в одном окне (examples/two_instances.html).
- Сохранение и восстановление эмулятора. Использование v86 для собственных целей так же просто, как:
var emulator = new V86({
screen_container: document.getElementById("screen_container"),
bios: {
url: "../../bios/seabios.bin",
},
vga_bios: {
url: "../../bios/vgabios.bin",
},
cdrom: {
url: "../../images/linux.iso",
},
autostart: true,
});
См. starter.js (src/browser/starter.js).
Лицензия
v86 распространяется на условиях упрощённой лицензии BSD, см. LICENSE. Следующие сторонние зависимости включены в репозиторий под их собственными лицензиями:
- lib/softfloat/softfloat.c
- lib/zstd/zstddeclib.c
- tests/kvm-unit-tests/
- tests/qemutests/
Благодарности
- Тестовые случаи процессора через QEMU.
- Дополнительные тесты через kvm-unit-тесты.
- Поддержка zstd включена для лучшего сжатия образов состояния.
- Включён Berkeley SoftFloat для точного эмулирования 80-битных чисел с плавающей запятой.
- Проект jor1k для драйверов 9p, файловой системы и uart.
- Источники некоторых старых операционных систем от WinWorld.
Ещё вопросы?
Отправьте мне электронное письмо на copy@copy.sh. Пожалуйста, сообщайте об ошибках на GitHub.
Автор
Фабиан Хеммер (https://copy.sh/, copy@copy.sh)
Комментарии ( 0 )