我应该如何开始?
最近我了解到,Fabrice Bellard通过模拟i586在JavaScript中创建了一个QEMU实现(或多或少,你明白了)。 这引起了我的兴趣,因为我一直对适合微处理器的复杂性着迷 - 因此希望实现与x86仿真器相同的任务。 然而,显然它可能不会那么复杂; 这不是主要观点。
我有操作系统和低级编程方面的经验,另外还有一些非常简单的CHIP8仿真器编程。 我确实知道简单的模拟器是如何工作的。 当我开始开发x86处理器时,如何利用我在这方面的现有知识 - 或者它与以前不同?
另外,我会感谢那些已经完成我急切想要完成的任务的人们的任何意见。 我应该在书桌上保留哪些书? (请注意,我爱书,我会非常感激建议。)论文? 我应该知道的网站? ...等等。
提前致谢。
我有一个简单的,在github上搜索thumbulator。
首先,你真正的目标是什么? 你对准确的教育类型模拟器感兴趣吗?或者你正在尝试使用vmware,qemu / kvm类型的速度,在后一种情况下利用执行主机处理器本身的指令百分比(而不是模拟)。 即使不想在主机上执行,但如果您对性能感兴趣(可能会牺牲准确性,可调试性或错误检查),请查看mame源代码,有很长的处理器模拟器列表是为了提高速度而编写的。
我上面提到的那个是为了教育目的而写的,特别是我的人和其他可能会感兴趣的人。 对于这种类型的模型,我推荐几个关键点。 抽象你的内存读,写和取操作(有一个read_mem_8()函数和write_mem_8()等,就像硬件的地址解码一样)。 同样将寄存器读/写操作抽象为函数。 模拟器围绕着一个执行一个指令函数的中心,在一个循环中调用一个指令或一个无限循环,或者在你的选择中间的某个地方。 这样,您可以从管理指令解码功能之外的前台或其他模式管理中断模式。 指令解码器与反汇编器不同,对于可变长度指令集(比如x86)来说,更简单一些,您不必通过执行查找指令的开始来查找字节,你假设二进制文件是真实的并且代码执行了,当然你需要有一个未定义的某种类型的指令处理程序。
对于一长串原因,x86不会是我的首选。 这里又是什么你的目标? x86将具有32/64位模式,具有内存保护机制,多种执行模式等等。我会(并且有很多次)从头几个简单的指令集开始,msp430,pic (老式的图片不是dspic也不是pic32),6502等等。在这个世界里有很多6502个ROM,你可以玩。 (请注意,有些6502模拟器存在缺陷)。 msp430和pic几乎没有说明,一旦你摆弄了一些东西,它就是一个下午的项目。 如果你仍然觉得你真的需要做一个x86的话,那么arm可能会成为x86的垫脚石。 各种执行模式,你可以根据需要模拟已知的mmu和fpu,并启动linux,windows等。
重新阅读你的问题我可能已经过分简化了我的答案,听起来像你有一些经验。 x86与任何其他处理器没有区别,因为您需要编译一些简单的二进制文件,这些二进制文件可以计算和循环,并且可以攻击二进制文件,解码和执行文件,从而增加测试程序的复杂性,添加更多支持您的模拟器的工具,有些观点会变得无聊,现在是进行长途打字会议的时候了,要经过并实施所有的指示(不必测试每一条指示)。 然后返回并尝试执行更复杂的二进制文件(尝试测试所有新指令)。 我倾向于使用自我检查测试,如压缩一些数据,然后使用开源软件包(针对嵌入式编译)进行解压缩,并比较输入和输出。 加密例程也很好,aes,des等md5,sha,它们不是自检,但是您可以在主机平台上预先计算答案并在测试中对答案进行硬编码。 开源jpeg,png等mp3解码器。 有定点jpeg和mp3解码器,或者你可以用一个软的fpu去。 不同的编译器会生成不同的指令组合,某些编译器完全不使用某些指令或指令序列,所以我强烈建议您使用这些测试程序并重新编译并运行它们,同时使用几种不同的优化设置并使用尽可能多的编译器处理器。 不同的高级语言也应该产生不同的指令混合。 您可能会发现,使用单一语言和单一编译器的单个程序员只会给你有限的覆盖范围,个人具有特定的编程习惯和样式,从而限制了输出的多样性,对于个人将要使用的汇编程序也一样他们产生的指令组合有限。
链接地址: http://www.djcxy.com/p/50557.html上一篇: how should I start?