Tiny386
简介
Tiny386 是一个用 C99 编写的 x86 PC 模拟器。该项目的亮点在于其可移植性。目前它可以在 ESP32-S3 等微控制器上启动 Windows 9x/NT。
该项目的核心是一个从头构建的、简单直接的 i386 CPU 模拟器。它缺少一些功能,例如调试、硬件任务切换以及某些权限检查,但它应该能够运行大多数 16/32 位软件。为了启动现代 Linux 内核和 Windows,添加了一些 486 和 586 指令。CPU 模拟器的代码量保持在约 6K 行。此外还有一个可选的 x87 FPU 模拟器。
为了组装一个完整的 PC 系统,我们从 TinyEMU 和 QEMU 移植了许多外设,目前包括: - 8259 PIC - 8254 PIT - 8042 键盘控制器 - CMOS RTC - 带 Bochs VBE 的 ISA VGA - IDE 磁盘控制器 - NE2000 ISA 网卡 - 8257 ISA DMA - PC 扬声器 - Adlib OPL2 - SoundBlaster 16
关于固件,BIOS/VGABIOS 来自 seabios。Tiny386 也支持直接启动 Linux 内核,无需传统 BIOS。这个想法来自 JSLinux,它使用一个名为 linuxstart 的小型存根代码。
演示
参见此处
构建
Linux:你需要先安装 SDL1.2 或 sdl12-compat,然后输入 make。
对于其他平台,请参考 .github/workflows/build.yml。
预构建的二进制文件:此处
使用方法
- 准备一个 ini 文件
[pc]
; 设置 BIOS 和 VGA BIOS 的路径
bios = bios.bin
vga_bios = vgabios.bin
; 设置内存大小和 VGA 内存大小
mem_size = 32M
vga_mem_size = 2M
; fda/fdb 用于软盘(可选)
fda = floppy.img
; hda/hdb/hdc/hdd 用于硬盘(可选)
; cda/cdb/cdc/cdd 用于 CD-ROM 光盘(可选)
hda = win95.img
cdb = win95_cd.iso
; "fill_cmos" 修复 win9x 中的 "MS-DOS compatibility mode",但会破坏 winNT...
fill_cmos = 1
[display]
width = 720
height = 480
[cpu]
; gen = 3/4/5,对应 386/486/586
gen = 3
; fpu = 0/1,禁用/启用 x87
fpu = 0
- 运行
./tiny386 config.ini
ESP32 移植
目前唯一支持的目标板是 JC3248W535 开发板。支持的 ESP-IDF 版本是 v5.2.x。
构建与烧录
你可以从这里找到预构建的闪存镜像 esp/flash_image_JC3248W535.bin。
预构建的镜像可以直接在偏移量 0 处烧录。
手动构建和烧录:
scripts/build.sh patch_idf # 对 ESP-IDF 应用补丁
cd esp
idf.py build
idf.py flash
配置
所有文件应放在使用 FAT/exFAT 文件系统的 SD 卡中。ini 文件应为 tiny386.ini 并放在根目录。
请参考 esp/tiny386.ini。
键盘/鼠标输入
开发板上没有输入设备,因此目前使用 wifikbd 通过 WIFI 将键盘/鼠标事件转发到开发板:
(ESP32-S3 开发板:监听 TCP 端口 9999) <--- WIFI ---> AP <--- WIFI/有线 ---> (PC: ./wifikbd esp_board_addr 9999)
许可证
CPU 模拟器及整个项目均采用 BSD-3-Clause 许可证授权。