基于硬件监视器的高效上下文敏感CFI执行
1. 评估基准
在对C/C++应用程序进行评估时,使用了SPEC2006基准套件的‘test’工作负载来计算基于PT的µCFI的运行时开销。不过,对于gcc、dealII、povray、omnetpp和xalancbmk等程序,由于PT在硬件层面会丢失数据包,在µCFI监视器中表现为段错误,所以未能获得相关结果。此外,在评估框架中,soplex也会导致µCFI监视器出现段错误。而perlbench由于频繁使用fork系统调用,会对单核造成更大压力,不能准确反映µCFI执行的跟踪处理性能影响,因此未纳入评估。对于gobmk,将dniwog输入作为一个单独的数据点,因为其数据包数量远高于其他数据点。
在Rocket处理器上评估基于PHMon的µCFI时,选用了能成功运行基于PT的µCFI的12个基准测试中的8个。但由于使用LLVM 7.0进行RISC - V交叉编译时出现错误,无法运行lbm、namd和gobmk;由于FPGA内存有限,无法运行mcf和perlbench;sjeng因规模太大,通过将其源代码中控制哈希表大小的TTSize值减小到3000后,才得以运行基于PHMon的µCFI。为进行公平评估,还在图6中报告了使用TTSize = 3000时基于PT的µCFI对sjeng的开销。
2. 评估结果
2.1 代码插桩开销
通过比较基线程序和为µCFI执行插桩后的程序的执行时间,测量了基准测试的插桩开销。结果表明,代码插桩(图5中的Instru),包括将c - data和ICT目标传输到µCFI监视器的RISC - V后端传递,平均仅产生1.7%的低性能开销。不过,对于生成更多数据包的基准