美文网首页
转载:Pin的插装流程

转载:Pin的插装流程

作者: 大a艺术家 | 来源:发表于2019-11-27 15:58 被阅读0次

    参考文献:《Pin:Building Customized Program Analysis Tools with Dynamic Instrumentation》

    Pin的插装流程:

    首先系统加载pin并进行初始化,再由pin去加载pintool,进行相关初始化,然后pintool请求pin运行待插装的程序。Pin则拦截程序运行的入口点。取一个trace然后进行即时编译,在即时编译过程中进行运行插装例程(Instrumentation Routine),判断插入点。然后将分析例程(即插装的代码)与源指令进行整合重新编译生成新的指令序列,并存储在code cache里,以备后续的执行。

    PS:trace: 一个trace即一个顺序执行的指令序列,直到遇到以下三种情况:1、无条件的控制转移,eg:call、return);2、预定义的条件控制转移数;3、预定义trace的指令数)

    Pin的系统架构:

    Pin的组成部分:VM、Code Cache、Instrumentation API。其中VM是Pin的核心组成部分,负责调度插装代码的执行。VM中包含:JIT Compiler、Emulation Unit、Dispatcher。JIT Compiler主要是对源程序指令进行即时重编译;Emulation Unit来解释一些不能被直接执行的指令;Dispatcher用来启动JIT编译以及检测程序代码。Code Cache是存放即时编译所生成的新二进制代码的缓存空间。Instrumentation API是由Pin提供给pintool,方便pin与pintool通信的接口。

    在一个被插装的程序运行过程中实际上有三个进程在运行:Pin、Pintool、Application。它们运行在相同的地址空间。但是它们并不共享任何库文件,三者都链接私有的库文件副本(eg: glibc),以解决不可重入的问题。

    Trace Linking&Register Re-allocation:

    Pin采取的JIT一些特性——Trace Linking、Register Re-allocation来优化插装代码 。

    Pin在Trace Linking中做了优化,一般情况下,一个已编译的trace在结束时,需要跳转到另一个trace去执行,需要从Code Cache切换到VM,由VM来判断并决定下一个跳转trace的地址,然后再将控制权交给Code cache去执行。这样就有额外的切换开销,影响效率。Pin利用一个可动态增长的链表将已编译的trace链接成一个单项链表。每次由一个trace跳转到另一个trace时,通过扫描此trace链表来寻找跳转的trace地址,仅当在链表中无匹配时,才切换到VM下,进行新的trace的编译,并添加到trace链表的表头。

    Pin在即时编译过程中使用Register Re-allocation策略来对寄存器进行重分配,优化插装代码。

    Pin的插装代码优化策略:

    Pin利用inline、liveness analysis、schedualing这些优化策略来对插桩代码进行优化,通过实施这些优化策略可以将即时编译所生成的插装后的代码量大大缩减,以提高插装代码执行的效率。

    ————————————————

    版权声明:本文为CSDN博主「zxu618」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/ben_chang/article/details/23535025

    相关文章

      网友评论

          本文标题:转载:Pin的插装流程

          本文链接:https://www.haomeiwen.com/subject/lzwpwctx.html