1. 使用Pin进行instrumentation

Pin提供的API可以让我们观察一个进程的状态,比如:内存、寄存器和控制流。Pin还提供了一些更改程序行为的机制,比如:允许重写程序的寄存器和内存。(DynamoRIO的理念是尽量不影响原程序的执行)
Pin通过一个just-in-time (JIT) compiler来实现instrumentation。这个compiler的输入不是bytecode,而是一个本地的可执行文件。可执行文件执行时,Pin会拦截它的第一条指令,然后产生(“compiles”)一个新的指令,放到一个code sequance中。然后控制就转移到了这个产生的code sequence开始执行。这个产生的code sequence和原始代码执行流程几乎一样,但是Pin会在code sequence的指令遇到分支时,重新获取控制权。在获取控制权之后,Pin会寻找到条件转移指令,并把它放到code sequence中,继续执行。
每当JIT获取指令时,Pintool就有机会在指令被翻译并执行前,去做instrumentation。被翻译的指令和它们的instrumentation被存放在一个code cache中,将来执行同样的指令时,就不需要翻译,直接在code cache中执行,以提高性能。
值得一提的是,IntelPin提供的API,让我们可以忽略底层架构,同一套代码在ARM和x86上都能运行。Intel Pin提供的API和DynamoRIO类似,都是事件导向的API(call-based model)。都很易用。

2. 系统架构

Intel Pin的架构如下图所示:

从较高层面来说,Pin包含了一个VM,一个code cache和一个instrumentation API.
其中VM包含了一个just-intime compiler (JIT),一个emulator和一个dispatcher. 在Pin获取了目标程序的控制后,VM通过协调它的组件来执行目标程序。JIT编译并instrument应用程序的指令,dispatcher把这些编译后的指令加载到code cache中。进入/离开code cache时,需要保存/恢复应用程序的寄存器状态。emulator会解释那些无法被直接执行的指令,这是为system call准备的,因为system call需要VM的特殊处理。
Pin工作在操作系统之上,因此它只能捕获用户级别的指令。
当一个被instrument之后的程序运行时,有3个程序在运行:应用程序本身、Pin、 Pintool. Pin是对应用程序进行instrument的引擎。Pintool包含了instrumentation的指令,它作为pin的一个library存在。
应用程序本身、Pin和Pintool共享同一个地址空间,但是他们不共享libraries,所以他们其实是glibc的3个拷贝。通过让三者的库独立私有,避免了Pin、Pintool和应用程序本身的交互冲突。比如:如果应用程序开始执行开始执行一个库函数,然后触发了JIT执行的指令,控制就会转向JIT。如果JIT也执行了相同的库函数,就会再次进入这个库函数,导致错误。因为不同组件拥有不同的库拷贝,所以Pin/pintool和应用程序本身不共享任何数据,也就不会有这种问题。(这一点和DynamoRIO不同,DynamoRIO为了解决这个问题,不和应用程序本身冲突,只能选择直接调用system call,导致DynamoRIO的instrument指令无法正常使用一些第三方库)。

3. Pin的injection机制

是injector负责把Pin载入到应用程序的地址空间中。
它利用了Unix的Ptrace API获得应用程序的控制和处理器的上下文,然后将Pin的库也在载入到应用程序的地址空间开始执行。Pin开始执行之后,会将Pin tool也载入到地址空间开始执行。
Pin初始化执行环境,然后开始对应用进程开始jit(可以从第一条指令,也可以从当前正在运行的指令开始)。Pin也可以从一个已经instrument过得进程中分离,回归到正常的原始应用程序运行。(DynamoRIO的dynamic loader实现机制则不同,它强制应用程序一开始,就要和dynamoRIO在一起,不可分离。相比之下Pin更加灵活)

4. The JIT Compiler

Pin将一个架构的指令直接编译成同样的指令,没有经过中间指令,编译后的指令存储在一个code cache中。只有code cache中的指令被执行了,原始的指令不被执行。
应用程序的指令是以trace为单位编译的,一个trace,就是一串指令,直到遇到以下条件终止:

(i) an unconditional control transfer (branch, call, or return),
(ii) a pre-defined number of conditional control transfers,
(iii) a pre-defined number of instructions have been fetched in the trace. 

每个trace可能有多个出口,比如条件指令,当碰到条件指令时,控制就会转移到VM,由VM去寻找目标trace.

4.1 Trace Linking

为了提升性能,Pin会将一些只有一个目标的trace,和它的目标trace连接起来。这样就不用去重新转移到VM,重新寻找目标了。然后,有些条件转移指令可能有不同的目标,这就需要indirect linking技术。这一点和DynamoRIO采用的技术是类似的。

4.2 Register Re-allocation

在jit运行时,我们经常需要额外的寄存器,比如:在解决indirect分支时,我们就需要3个空闲的寄存器。
当instrumentation对一个应用程序插入一段代码,JIT必须保证这段代码没有重写任何应用程序正在使用的寄存器。
Pin的解决方案是构建一些虚拟的寄存器,Pin和Pin tool在使用时可以将它们看做正常的寄存器使用。

Intel Pin架构相关推荐

  1. intel Pin简要介绍及示例程序

    Intel PIN Intel PIN References 二进制动态插桩简介 源插桩与二进制插桩 静态插桩与动态插桩 常见的动态插桩工具 Intel Pin简介 Intel pin动态插桩框架 简 ...

  2. Intel x86架构之多处理器与APIC

    注意:下文中已经指出手册中的对应页面和章节,请对照手册原文看,任何个人理解错误,请包涵. 一,以下内容来自(P25):3.6 Multiprocessor Interrupt Control 在多处理 ...

  3. intel cpu 漏洞 linux,Intel CPU架构漏洞越捅越大:打补丁将损失30%性能

    还记得前不久那个被曝光影响大面积Intel Core CPU产品的安全漏洞吗?这貌似只是冰山一角,就在今天人们发现了Intel处理器里一个更为致命的漏洞,从最底端的Pentium,到最新的Coffee ...

  4. 突破硬件瓶颈(一):Intel体系架构的发展与瓶颈挖掘

    软件定义存储SDS正在从容量型向性能型演进,千万级IOPS和微秒级低延迟,非常具有挑战性.3节点标准x86服务器,能否有可能实现1000万IOPS与200us低延迟?这个可以有.硬件性能并不是瓶颈所在 ...

  5. Intel MIC架构下COI框架介绍

    开始介绍之前先写一下历史背景,为了最大限度地提高计算速度,单一地提高一个核的主频以提高计算速率的方法已经不再适用.所以向量机.超标量计算机等纷纷出现,并行计算也再度成为了一个热门的方向.现有的并行计算 ...

  6. Intel CPU架构处理器漏洞越捅越大 打补丁将损失30%性能

    还记得前不久那个被曝光影响大面积Intel Core CPU产品的安全漏洞吗?这貌似只是冰山一角,就在今天人们发现了Intel处理器里一个更为致命的漏洞,从最底端的Pentium,到最新的Coffee ...

  7. 关于Intel pin的学习笔记(一)——KNOB< TYPE>构造函数的解释

    关于KnobOutputFile()函数的解释 对于KnobOutputFile()这个函数我在网上很少能找到对他的详细解释,今天好好的研究了一下,顺便记录下来. 首先对这个函数的第一映像是,为啥文件 ...

  8. 剖析Intel IA32架构下C语言及CPU浮点数机制

    (转载请注名原作者及出处) pdf格式下载:http://www.binghua.com/Soft/Class2/Class5/200409/63.html 剖析Intel IA32架构下C语言及CP ...

  9. skylake服务器处理器M系列,瞄三大产品线!谈Intel Skylake架构CPU

    1桌面Skylake架构值得期待 近日,英特尔其下一代代号"Skylake"芯片被透露更多细节,Skylake处理器是Intel继Broadwell之后的新一代处理器,属于Tock ...

最新文章

  1. 编写更少量的代码:使用apache commons工具类库
  2. SQL Server中,with as使用介绍
  3. MySQL GROUP BY 语句
  4. 高级精致智能快捷的Web设计原则案例
  5. 第十九讲:职责链模式
  6. Unity如何刚体控制物体的移动以及旋转
  7. 元素显示模式转换(HTML、CSS)
  8. 无根树的同构:Hash最小表示法(bzoj 4337: BJOI2015 树的同构)
  9. SQL 2008 FileStream数据类型
  10. 如何用matlab计算不确定度,Matlab计算“间接测量物理量的不确定度”
  11. WIN10添加纯英文输入法
  12. azw3怎么在Mac电脑上打开?
  13. biopython安装_python下如何安装biopython
  14. 误差柱状图的三种实现方法
  15. 参数方程绘制球面、椭球面、环面_OpenGL
  16. 叶俊应浙江警官学院的邀请讲授《司法警官的心理调试实用策略》
  17. OSChina 周日乱弹 ——给苹果电脑选机械键盘
  18. python控制苹果手机触摸屏失灵怎么办_苹果手机触摸屏失灵怎么办
  19. CMMI流程—配置管理流程
  20. 程序员找工作黑名单,避雷针!

热门文章

  1. python爬虫网络中断_Python 爬虫总是超时中断?试试Tenacity重试模块
  2. PG基于pgpool-II实现读写分离和负载均衡
  3. torch.round()
  4. linux和windows接口中文乱码_Loadrunnerweb接口基础
  5. 计算机桌面图标教案,计算机教案模板
  6. 自定义oracle异常,详解Oracle自定义异常示例
  7. java 展现层框架_spring快速入门例子教程:06展现层
  8. 并发测试工具_性能测试工具基本工作原理及基本操作流程
  9. 放大镜_医用手术放大镜
  10. Java 算法 S01串