现在的位置: 首页 > 综合 > 正文

动态编译实现ARM模拟

2018年02月15日 ⁄ 综合 ⁄ 共 695字 ⁄ 字号 评论关闭

在A指令集的CPU上模拟另一个B指令集CPU的指令,最慢的办法是在A上一条一条解析B指令来运行,在A上用一些变量来代表B指令集的各个寄存器,并要判断指令中的特殊的跳转条件和特殊操作等。如skyeyes等,微软的virual studio 2005上的模拟嵌入式设备的device emulator工具不知道是不是这样实现的。还有一种办法是把B指令翻译成A指令,这样运行的速度也很快,但加载的速度慢,且加载的过程中也要判断中断向量表等特殊的东西。但是如果在高版本指令集的ARM CPU如果去模拟低版本指令集的ARM CPU指令呢?会不会找到另一种办法来更快得模拟。最快的模拟方式是指令翻译加动态加载,一般来说程序大部分时间是在一定的范围内顺序执行或循环,不会十分频繁地到处乱跳,如果把ARM指令翻译成mips指令,则容易多了,因为mips的通用寄存器实在是太多了,先说说ARM翻译成mips吧,首先当然得看原始CPU的资料,这样能知道哪些是访问外设的,哪些是特殊指令(访问CPSR或协处理器等的地方,跳转指令),假设程序很小,可以一次加载完,则一条条解析,要记住ARM和THUNMB切换的状态,遇到访问I/O等特殊指令,则翻译成调宿主CPU一个汇编函数,在宿主CPU的汇编函数里再调宿主CPU对应的C函数,里面想怎么实现就看怎么模拟这个IO了。如果程序很大,则分段加载,段的大小可以自己分,比如32K为一段,类似虚拟内存,跳转到没加载的段,则加载那一段,释放最旧的段,跳到新段对应地址运行。支持分段加载的话,翻译的时候要判断BL等跳转指令,发现是跨段调用,则要改成翻译IO的那种方式。把它称作STUB

 

抱歉!评论已关闭.