Helper Function Inlining in Dynamic Binary Translation

论文链接: http://cobweb.cs.uga.edu/~wenwen/papers/cc21.pdf

Abstract

动态二进制翻译(DBT)是许多重要应用的基石。在DBT中,Helper Function为系统的构建带来了很大的便利,但与此同时也引入了不小的开销。本文作者提出了一种将Helper Function内联化的方法。

…省略

DBT

Helper Functions

不同指令集下的指令看似功能相似,实际上可能包含完全不同的语义,这就给DBT工作带来了很大的困难。

比如说,将guest的间接跳转指令翻译到host上时,我们可能需要去查表来找到host指令对应的跳转地址。又或者,有的指令集的浮点运算并没有严格实现IEEE 754标准。为了解决这些潜在的语义,我们需要在翻译时额外花费大量精力。

为了解决这一问题,我们引入了helper function来模拟guest instr的复杂语义。

helper function听起来很神秘,但实际上就是一个函数,模拟一条指令的语义。这样,再复杂的指令语义翻译,都可以用helper function解决。图(假装有)中展示了一条AArch64指令是怎样被转换到Host上的

到了这里,我们可以发现,这样的作法带来了两处不可忽视的开销:

  1. 函数的调用带来了上下文的切换,传参,传返回值带来的开销是很大的
  2. helper function往往是被编译在DBT Text段中的,如果Code Cache中的程序流调用位于DBT Text中的helper function, 就破坏了Instr缓存的locality。

Inlining Helper Functions in DBT

Inlining Helper Function 可以解决上面两个问题,就像传统编译器的函数内联那样,但它的实现却有很大困难:在一个DBT中,对HF的调用是动态生成的,但是HF本身是静态编译的。这意味着调用者与被调用者之间存在根本性的区别——他们不是由同一套编译器完成的,因此现存的优化方案将变得不可行(why?)。

一种简单粗暴的想法是在Code Cache中直接创建一份HF的拷贝,但考虑到诸多原因,这并不可行:比如HF的native版本中可能存在以PC为基地址的寻址。为此,我们需要对HF的代码做一些修改,来让它能内联进Code Cache里。

具体的方案:在HF被编译为ASM后,用Code Extraction提取出来,再用Code Transformation生成可在 Code Cache中执行的ASM和Relocation Records。在需要时,将其编译到Code Cache中。

重定位信息生成

生成hfi文件