Pin~动态插装原理

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

  1. Pin的插装流程:

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

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

  2. Pin的系统架构:

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

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


  3. Trace Linking&Register Re-allocation:

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

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

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

  4. Pin的插装代码优化策略:

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值