年前用过一段时间pin,虽然能够使用已有的pintools做一些程序分析,但是其中有一些概念我一直都没搞明白,最近有段空闲,重新看了一下pin的document,对不懂的问题重新google了一下,总算搞明白了,现在和大家分享一下,希望对需要的人有点帮助。
首先陈述我以前搞不明白的问题:
1、Pin和Pintools的区别
2、Pintools的instrumentation code(routine)和analysis code(routine)的区别
3、pin提供的VM lock是什么?在写一个适用于muti-thread apps的pintools时,什么情况下需要加锁?什么时候没必要?
其实上述问题,pin的官方document(点击打开链接)的说得很清楚,但是只看那些生硬的说明,刚看时我确实瞢了,我下边把我的理解说一下,有必要的话举一些例子。
》1、Pin和Pintools的区别
官方文档说得相当清楚,我就只说我的理解。
Pin类似JIT compiler,它会拦截可执行程序,在拦截的可执行代码区,可以插桩instrumentation info等,然后释放控制,让变换后的code执行;当从变换后的code跳转到其他未经变换的code时,pin可以重新获得控制,进一步对需要变换的code执行变换。
Pintools可以认为就是pin的plugins,与pin结合,负责在拦截的程序哪个部位插入instrumentation info(instrumentation routine)以及插入什么样的code(analysis routine)。
》2、Pintools的instrumentation code(routine)和analysis code(routine)的区别。
正确理解两者的区别,对理解适合多线程apps的pintools的加锁方法很重要。
按文档说明的,instrumentation routine即是负责在拦截的code的哪儿插入什么code,而analysis routine即是插入的code是什么。
我结合官方的一个用于统计指令条数的pintools定位一下:
定位之后,我们就分析一下两者分别在什么时候运行,这点很重要。
(1)instrumenation routine在pin拦截了程序后,对程序进行变换时运行。
(2)analysis routine是插入拦截的程序中的code,也即是在变换后的程序中,只有变换后的程序运行时才会真正执行。
》3、pin提供的VM lock是什么?在写一个适用于muti-thread apps的pintools时,什么情况下需要加锁?什么时候没必要?
VM(Virtual machine)lock 即是pin的internal lock,无论面对单线程还是多线程,pin都只有一个实例,所以pin在处理拦截的code时,就是按串行进行的。因此对于pintools中的global data, 如果只用于instrumentation routine,就没必要加锁,因为正如上边说到的, instrumentation routine是在pin拦截了程序后,对程序变换时运行,即是在pin实例中串行运行。而如果analysis routine中要用到global routine就不一样了,因为这是实际并行执行的code,而且与pin实例也存在并行,因此这时候,无论在analysis routine中还是在instrumentaion routine中都要求加锁。
最后补充一下:
(1)使用PIN_AddThreadStartFunction()等注册的function不是instrumentation routine,而是notification callback funtion,是一种特殊的analysis routine。
(2)Instrumentation routines are registered with xxx_AddInstrumentFunction() where xxx is type of instrumented object, e.g. IMG, RTN, TRACE, INS.
(3) 有人在pin的官方yahoo的讨论组中询问过关于pintools如何支持muti-thread apps,见链接点击打开链接。intel pin groups 还有一篇介绍pin支持muti-thread的paper,见点击打开链接