1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2022 年 1 月 18 日 |
---|
#25 在 #x86
19,516 星 & 347 关注者
4MB
79K SLoC
或在 irc.libera.chat 上的 #v86
v86 模拟了一个与 x86 兼容的 CPU 和硬件。机器码在运行时被翻译成 WebAssembly 模块,以实现良好的性能。以下是被模拟的硬件列表
- 一个与 x86 兼容的 CPU。指令集大约在 Pentium 4 级别,包括完整的 SSE3 支持。某些特性缺失,特别是
- 任务门,保护模式下的远调用
- 一些 16 位保护模式特性
- 单步执行(陷阱标志,调试寄存器)
- 一些异常,特别是浮点数和 SSE
- 多核
- 64 位扩展
- 一个浮点单元 (FPU)。计算使用 Berkeley SoftFloat 库进行,因此应该是精确的(但速度较慢)。三角函数和对数函数使用 64 位浮点数进行模拟,可能不够精确。不支持所有 FPU 异常。
- 一个软盘控制器(8272A)。
- 一个 8042 键盘控制器,PS2。支持鼠标。
- 一个 8254 可编程间隔定时器(PIT)。
- 一个 8259 可编程中断控制器(PIC)。
- 部分 APIC 支持。
- 一个 CMOS 实时时钟(RTC)。
- 一个支持 SVGA 和 Bochs VBE 扩展的通用 VGA 卡。
- 一个 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上 — 性能分析 — CPU休眠
兼容性
以下是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 XP、Vista和8在某些条件下运行正常(请参阅#86、#208)
- 许多业余操作系统都能运行。
- 9front运行正常。
- Plan 9无法正常工作。
- QNX可以正常工作。
- OS/2无法正常工作。
- FreeBSD可以正常工作。
- OpenBSD需要特定的启动配置才能正常工作。在
boot>
提示符下输入boot -c
,然后在UKC>
提示符下输入disable mpbios
和exit
。 - NetBSD仅支持自定义内核,请参阅#350。
- SerenityOS可以正常工作(仅限32位版本)。
- SkiftOS可以正常工作。
您可以在以下链接中获取有关磁盘镜像的信息:https://github.com/copy/images。
如何构建、运行和嵌入?
您需要
- make
- Rust,并具有wasm32-unknown-unknown目标
- 与Rust兼容的clang版本
- java(用于Closure Compiler,使用
debug.html
时不需要) - nodejs(需要较新版本,已知的v16.11.1版本可以正常工作)
- 要运行测试:nasm、gdb、qemu-system、gcc、libc-i386和rustfmt
有关在Debian或WSL上完整设置的详细信息,请参阅tools/docker/test-image/Dockerfile。
- 运行
make
来构建调试版本(在debug.html
中)。 - 运行
make all
来构建优化版本(在index.html
中)。 - ROM和磁盘镜像通过XHR加载,因此如果您想在本地上尝试
index.html
,请确保从本地Web服务器提供服务。您可以使用make run
使用Python的http模块来提供文件。 - 如果您只想在网页中嵌入v86,可以使用libv86.js。有关使用方法,请参阅示例。您可以从发布部分下载它。
或者,使用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
以找到托管服务器。
通过Dev Container运行
- 如果您使用的是支持Dev Containers的IDE,例如GitHub Codespaces、Visual Studio Code Remote Container扩展,或者可能是Jetbrains的IntelliJ IDEA等,您可以在Dev Container中设置开发环境。
- 遵循您开发环境的说明来设置容器。
- 运行“获取图像”任务以下载测试所需的图像。
测试
测试用的磁盘镜像不包括在本存储库中。您可以直接使用
wget-从网站上下载它们:/https://i.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示例
将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。
许可证
v86在简化版BSD许可证的条款下分发,请参阅LICENSE。以下第三方依赖项包含在存储库中,它们的许可证如下
致谢
- CPU测试用例通过QEMU
- 更多测试通过kvm-unit-tests
- 包含zstd以更好地压缩状态图像
- 包含Berkeley SoftFloat以精确模拟80位浮点数
- 为9p、文件系统和uart驱动程序包含The jor1k项目
- 包含一些旧操作系统的源代码WinWorld
还有其他问题?
请发送电子邮件至copy@copy.sh
。请将错误报告在GitHub上。
作者
Fabian Hemmer (https://copy.sh/, copy@copy.sh
)