80386 微代码反汇编挑战重重博主发布 8086 微代码反汇编后Ken Shirriff 提供了 80386 微代码 ROM 的高分辨率图像。然而80386 微代码规模比 8086 大得多达到 94720 位转码和检查极其繁琐。而且80386 完全是黑匣子没有类似 8086 的专利框架和代码片段从何处入手成为难题。众人助力提取二进制数据几年后博主在 Discord 上和 GloriousCow、Smartest Blob 等人聊天他们认为获取 80386 芯片高分辨率图像并提取微代码很有趣。博主虽觉得将图像转化为二进制数据再到可理解的微代码太难但他们把这当成挑战运用图像处理、神经网络和人工辅助自动化技术几天后就提取出二进制数据并交叉验证。反汇编过程逐步推进对 80386 微代码进行反汇编仍具挑战。大家发现各种模式重新排列使其一个轴表示微操作另一个轴表示微操作位确定读取顺序划分微操作位字段。根据 8086 研究推测部分字段用途还发现规律模式可能表示指令结束。Ken 追踪芯片线路和逻辑片段帮助看清连接情况。同时对指令解码器和保护测试 PLA 进行解码最终将 386 指令与微代码片段关联起来。80386 指令特点分析80386 每个周期运行速度比 8086 快通过投入更多晶体管实现“硬件加速”微代码更多是设置加速器。微代码从解码 ROM 有 215 个入口点比 8086 的 60 个显著增加原因包括新指令和不同处理因素。常见问题解答是否有微代码未处理的指令令人惊讶80386 每条指令都有对应微代码始终执行微操作。微代码中是否有“垃圾代码”从 0x849 到 0x856 的例程似乎无关联入口点与 #PF 例程有相似处但作用不明。微代码是否有隐藏功能、操作码或彩蛋博主可能发现保护模式操作系统 IO 权限位图处理漏洞4 字节端口访问时微代码只检查前 3 个地址权限位可能导致访问错误。不过也可能是误解且该漏洞可能只在某些 CPU 版本出现。如何学习理解微代码反汇编nand2mario 撰写了相关博客文章是很好的起点也可参考反汇编代码所在 git 仓库文件。在哪里可以下载反汇编代码可在 GitHub 上的 x86 微代码仓库找到可从 parts.txt 文件开始或直接打开 microcode_10.txt 查看反汇编内容。致谢与回复博主感谢 Daniel Balsom、Smartest Blob、nand2mario 和 Ken Shirriff。Zir Blazer 回复指出文章未提及分析基于的 80386 步进版本还希望看到不同步进版本微代码变化以及通过加载不同版本微代码重现漏洞和错误。