模拟x86处理器--应该如何启动?

模拟x86处理器--应该如何启动?,x86,emulation,X86,Emulation,最近,我了解到Fabrice Bellard通过模拟i586,在JavaScript中创建了QEMU的实现(或多或少,你都知道)。这引起了我的兴趣,因为我一直着迷于微处理器内部的复杂性——因此希望实现与实现x86仿真器相同的任务。然而,显然,它可能不会那么复杂;这不是重点 我确实有操作系统和低级编程的经验,此外还有一些非常简单的CHIP8仿真器编程。我知道简单的模拟器是如何工作的。当我着手开发x86处理器时,我如何利用我在这方面的现有知识——或者它太不一样了 我也将感谢你们中那些已经完成了我热切

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

我确实有操作系统和低级编程的经验,此外还有一些非常简单的CHIP8仿真器编程。我知道简单的模拟器是如何工作的。当我着手开发x86处理器时,我如何利用我在这方面的现有知识——或者它太不一样了

我也将感谢你们中那些已经完成了我热切尝试的工作的人的任何意见。我的书桌上有书吗?(请注意,我喜欢书。我非常感谢推荐。)论文?我应该知道的网站。。。等等


提前谢谢。

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

我上面提到的那篇文章更多的是为了教育目的而写的,特别是我的,以及任何其他可能觉得有趣的人。对于这种类型的模型,我推荐几个关键点。抽象内存读取、写入和获取操作(有一个read_mem_8()函数和write_mem_8()函数等,这与硬件处理解码等类似)。同样,将寄存器读/写操作抽象为函数。模拟器围绕一个执行一个指令函数,在一个循环中调用一个固定的指令或一个无限循环,或者在中间的某个地方,你的选择。这样,您就可以从前台管理中断模式,或者管理指令解码功能之外的其他模式。指令解码器与反汇编程序没有什么不同,它更简单,因为对于可变长度指令集(如x86),您不必找到一种方法来搜索字节以查找指令的开头,通过执行,您假定二进制是实的,代码执行,当然,您需要某种类型的未定义指令处理程序

x86并不是我的首选,原因有很多。再说一遍,你的目标是什么?x86将有32/64位模式、内存保护方案、多种执行模式等。我会(而且有很多次)从一个简单的指令集开始,开始使用msp430、pic(旧的pic不是dspic也不是pic32)、6502等等。mame世界中有许多6502 ROM可以使用。(请注意,6502模拟器中有一些存在bug)。msp430和pic几乎没有说明,一旦你掌握了方向,它们就是一个下午的项目。如果您仍然觉得确实需要使用x86,那么arm可能是x86的垫脚石。在各种执行模式下,您可以根据需要模拟已知的mmu和fpu,并引导linux、windows等


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

。。。您想在x86上模拟x86吗?我不知道你会不会找到很多关于这方面的书和论文。为此,直接在主机CPU上执行来宾代码更有意义。当然,这是最简单的方法。然而,由于我开始这个项目仅仅是为了学习它是如何工作的,这不是我的首选方法。更像是映射操作码,模拟其他硬件,如8259,使其更适合我的目的,等等。@JohanKotlinski,如果他写的是t