1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2022 年 1 月 18 日

#25#x86

19,516 星 & 347 关注者

4MB
79K SLoC

Rust 30K SLoC // 0.0% comments · Rust 包仓库 JavaScript 26K SLoC // 0.1% comments · Rust 包仓库 C 23K SLoC // 0.5% comments · Rust 包仓库 Python 270 SLoC // 0.1% comments · Rust 包仓库 Shell 33 SLoC // 0.1% comments · Rust 包仓库

加入 https://gitter.im/copy/v86 的聊天 或在 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 声卡。

演示

9frontArch LinuxAndroid-x86 1.6-r2Android-x86 4.4-r2BasicLinuxBuildroot LinuxDamn Small LinuxELKSFreeDOSFreeBSDFiwixOSHaikuSkiffOSReactOSWindows 2000Windows 98Windows 95Windows 1.01MS-DOS 6.22OpenBSDOberonKolibriOSSkiftOSQNX

文档

工作原理网络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-vmdarin755/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和更高版本中,PC类型必须从ACPI PC更改为标准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> 提示符下输入 disable mpbiosexit
  • 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。以下第三方依赖项包含在存储库中,它们的许可证如下

致谢

还有其他问题?

请发送电子邮件至copy@copy.sh。请将错误报告在GitHub上。

作者

Fabian Hemmer (https://copy.sh/, copy@copy.sh)

无运行时依赖

特性