模拟x86处理器 - 我该如何开始?

rot*_*ume 6 x86 emulation

最近我了解到,Fabrice Bellard通过模拟i586在JavaScript中创建了QEMU的实现(或多或少,你得到了这个想法).这引起了我的兴趣,因为我一直对微处理器内部的复杂性着迷 - 因此希望实现与实现x86仿真器相同的任务.但是,显然它可能不会那么复杂; 这不是重点.

我确实有操作系统和低级编程的经验,此外还有一些非常简单的CHIP8仿真器编程.我知道模拟器的工作原理.当我开始开发x86处理器时,如何利用我在这个领域的现有知识 - 或者它是否太不同了?

此外,我将感谢那些已经完成了我渴望尝试的人的任何意见.我应该把书放在书桌上吗?(请注意,我喜欢书籍.我非常感谢建议.)论文?我应该知道的网站?......等等.

提前致谢.

old*_*mer 8

首先,你的真正目标是什么?您是否对准确的教育类型模拟器感兴趣,或者您正在尝试使用vmware,qemu/kvm类型的速度,在后一种情况下利用主机处理器本身执行一定百分比的指令(不模拟).即使不想在主机上执行,但如果您对性能感兴趣(可能牺牲精度或可调试性或故障检查),请查看mame源,有一长串的处理器模拟器是为了提高速度而编写的.

我上面提到的那个更多是出于教育目的,特别是我的,以及其他任何可能发现它有趣的人.对于那种类型的模型,我建议一些关键点.摘要你的内存读取,写入和获取操作(有一个read_mem_8()函数和write_mem_8()等,就像硬件解析解码一样).同样将寄存器读/写操作抽象为函数.模拟器以执行单个指令函数为中心,在一个循环中调用固定数量的指令或无限循环,或者在中间的某个地方,您的选择.这样,您可以从管理指令解码的函数之外的前台或其他模式管理中断模式.指令解码器与反汇编器不同,它在某种意义上更简单,对于可变长度指令集(如x86),您不必通过执行来寻找搜索指令开始的字节的方法,你假设二进制是真实的并且代码执行,当然你需要有某种未定义的指令处理程序.

由于一长串原因,x86不是我的首选.这又是你的目标吗?x86将具有32/64位模式,将具有存储器保护方案,多种执行模式等.我会(并且有很多次)从最初几次更简单的指令集开始,msp430,pic (较旧的照片不是dspic也不是pic32),6502等.你可以在mame世界中使用6502个rom.(请注意,6502模拟器中的一些存在错误).msp430和pic只有很少的指令,一旦你掌握了一些东西就是一个下午的项目.如果你仍然觉得你真的需要做x86,手臂可能是x86的垫脚石.各种执行模式,你可以根据需要模拟已知的mmu和fpu并启动linux,windows等.

重新阅读你的问题我可能会过度简化我的回答,听起来你有一些经验.x86与任何其他处理器没什么不同,你需要编译一些简单的二进制文件,例如计数和循环,攻击二进制文件,解码和执行,增加测试程序的复杂性,添加更多支持模拟器的指令,at有些事情变得枯燥乏味,现在是时候进行长途打字会议,完成并实施所有指令(不必测试每一个).然后返回并尝试执行更复杂的二进制文件(尝试测试所有新指令).我倾向于使用自检测试,例如压缩一些数据,然后使用开源软件包(为嵌入式编译)解压缩并比较输入和输出.加密例程也很好,aes,des等md5,sha,它们不是自我检查,但你可以在主机平台上预先计算答案并在测试中硬编码答案.开源jpeg,png等mp3解码器.有定点jpeg和mp3解码器,或者你可以使用软fpu.不同的编译器产生不同的指令混合,一些编译器根本不使用某些指令或指令序列,因此我强烈建议使用这些测试程序并使用几种不同的优化设置重新编译和运行它们,并使用尽可能多的编译器.处理器.不同的高级语言也应该产生不同的指令混合.您可能会发现使用单一语言和单个编译器的单个程序员只会给您有限的覆盖范围,个人具有限制输出变化的特定编程习惯和样式,对于汇编者而言,个人将会他们产生的指令组合有限.