开发者生态
morning
z386:围绕原始微码构建的开源 80386
2026-05-23
1 阅读
wicket
这是 80386 系列的第五部分。 FPGA CPU 现在已经足够运行真正的软件了,这篇文章将介绍它的工作原理。 z386 是围绕原始 Intel 微码构建的 386 级 CPU,与 z8086 的精神相同。该内核不是 RTL 中的逐指令仿真器。目标是重新创建足够多的原始机器,以便恢复的 386 控制 ROM 可以驱动它。如今,z386 可以启动 DOS 6 和 DOS 7,运行 DOS/4GW 和 DOS/32A 等保护模式程序,并玩《Doom》和《Cannon Fodder》等游戏。以下是针对 ao486 的一些粗略数据: 指标 z386 ao486 代码行数 (cloc) 8K 17.6K ALUT 18K 21K 寄存器 5K 6.5K BRAM 116K 131K FPGA 时钟 85MHz 90MHz 3DBench FPS 34 43 Doom(原始)FPS,最大细节 16.5 21.0 在当前版本中,z386 的性能类似于快速(~70MHz)缓存的 386 级机器或低端 486。它的运行时钟比历史上的 386 CPU 高得多,但 CPI(每条指令的周期)稍差。当前的缓存是 16 KB、4 路组关联统一 L1,部分选择是为了保持时钟为高电平。真正的高端 386 系统通常使用更大的外部缓存,通常在 32 KB 到 128 KB 范围内。 《毁灭战士 II》在 z386 上运行。前面四篇文章已经介绍了 386 微架构考古学的大部分内容:乘法/除法数据路径、桶式移位器、保护和分页以及内存管道。 z386试图既是一个教育重构,又是一个可用的FPGA CPU。它保留了许多类似 386 的结构:32 项分页 TLB、形状像原始的桶形移位器、ROM/PLA 式解码、保护 PLA 模型,以及最重要的 37 位宽、2,560 项微代码 ROM。同时,它在有意义的地方使用了 FPGA 友好的快捷方式,例如用于乘法的 DSP 模块和小型快速 L1 缓存。在这篇文章中,我将填写设计的其余部分:指令预取、解码、微码定序器、缓存设计、测试、z386 与 ao486 的不同之处,以及一些从启动中获得的经验教训。从 z8086 到 z386 首先介绍一些背景知识。去年我写了z8086,一个原始微码驱动的8086,基于reenigne的反汇编工作。该项目表明围绕恢复的微代码构建一个可工作的 CPU 是可能的。临近年底,我了解到 80386 微代码最近被提取出来,而 reenigne 和其他几个人(在本文末尾注明)正在进行反汇编。他们慷慨地与我分享他们的工作,z386 从那里开始。 386 与 8086 是一个非常不同的问题。指令集更大,内部状态更丰富,并且机器必须强制执行保护、分页、特权检查和精确故障。更重要的是,80386的微操作更密集、更上下文化。如果 8086 微代码读起来像一个简单的 C 程序,那么 386 微代码读起来更像是手工调整的汇编:简短、微妙,并且充满了有关隐藏硬件的假设。这个谜题花了大约四个月的晚上和周末。结果还不是完美的 386,但它现在已经足够运行真正的保护模式 DOS 软件了。 z386 - 高层视图 从高层来看,386 围绕八个主要单元进行组织。 z386 遵循相同的划分,足以使原始的 Intel 框图仍然是一个有用的图。 80386为八个合作单位。资料来源:英特尔,英特尔 80386 - 架构和实现,图 8。该图实际上很好地映射了实际的 386 芯片,尽管单元的相对位置不同。 80386 芯片上也有同样的八单元组织。基本图像:Intel 80386 DX 芯片,维基共享资源。以下是这些单元在 z386 中的作用: 1. 预取单元。保持内存中填充 16 字节代码队列。分支、故障、中断和段更改可以刷新并重新启动它。 2.解码器。使用指令字节、跟踪前缀、识别 ModR/M 和 SIB 形式、收集立即数和位移,并将指令映射到微代码入口点。 3.微码定序器。获取扩展的微码字,处理跳转、延迟槽、故障和运行下一条指令行为。 4. ALU 和移位器。实现算术、逻辑、标志、位运算、移位、旋转、乘法和除法支持。 5. 分段单元。计算逻辑到线性地址,应用段基址和限制,并存储隐藏的描述符缓存状态。 6.保护装置。重新创建 386 Protection PLA 行为以进行选择器和描述符验证。 7.寻呼单元。处理 TLB 查找、页面遍历、访问/脏更新、页面错误以及从线性地址到物理地址的转换。 8.BIU/高速缓存/内存路径。将 CPU 内存操作连接到分页、高速缓存、SDRAM、ROM、I/O 和周围的 PC 系统。这种组织方式与现代 RISC 型 CPU 通常显示的整洁管道有很大不同。 386 更好地被认为是几个大型的、部分独立的