指令集转换器/仿真器中的直接预解码线程 |
您所在的位置:网站首页 › tlb有脏位吗 › 指令集转换器/仿真器中的直接预解码线程 |
我已经编写了RISC型处理器(以及所有外围设备)的完整系统模拟器/仿真器.目前,它使用间接线程仿真循环.即所有指令页脚都是这样的风格: pc += 4; inst = loadWord(mem, pc); instp = decodeTable[opcode(inst)]; goto *instp这表现得非常好,我在启动Linux时在现代机器上获得了大约70-80 MIPS,这是相当不错的. 但是,我正在考虑转向直接预先编码的线程解释器模型,这看起来如下所示: tPC += 1; instp = predecodeMem[tPC].operation; goto *instp;预解码本身并不是一个问题,它只是替换现有的解码器和添加一些影子存储器.我的主要问题是自修改代码(或半自修改代码). 在简单的情况下,我们可以在访问之前未执行的页面时懒惰地分配预解码页面.然后从所有条目中清除软件TLB以确保我们在下一次写入该页面时通过存储器模拟系统,因此,写入可执行页面将不得不更新解码信息以及性能成本,但是很少见,我们应该没有问题(我们也可以通过添加在运行时计算的子页面可执行位来加快速度). 这里的问题是关于在仿真器内运行的操作系统重用页面时的长期代码发现.例如,内核页面可以由Linux内核分配,分配为一个进程的代码.下一次创建进程时,页面可能被分配为数据,但在刚才描述的方案中,这会引起问题,因为现在纯数据页必须在每个字节写入时经历相当慢的预解码. 一些当前的想法,但不是这些我发现特别好,即它们都有明显的缺点:
执行页面时使用mprotect()并使用信号处理程序拦截保护错误.这会减慢写入速度,并使多线程多核仿真变得困难. 在写入时,我们不是更新预解码信息,而是刷新与代码执行相关的软TLB转换,并稍微翻一下脏页面.这应该会减慢该页面上的代码执行速度,但至少读取和写入速度很快.问题当然是下次将页面重用为可执行文件而不是数据时,我们会遇到同样的问题. 移动到较小的预解码缓存,其中保留了具有预解码信息的有限数量的页面.这些页面会根据LRU策略或类似内容逐渐老化并被逐出.然而,这种方法会惩罚具有固定存储器布局的应用程序(即许多嵌入式应用程序).
我发现文献严重缺乏关于这个主题的讨论.存在哪些通用方法可以在不再使用页面时使页面老化,以便我们例如清除与页面关联的执行位和预读码存储器? |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |