440 likes | 776 Views
LUG. SEntre :基于龙芯的动态二进制插桩. 彭 飞 龙芯合肥研发. 主要内容. 背景介绍 基于龙芯的动态二进制插桩方法 运行时整体插桩方法及系统实现 SEntre 运行时交互式插桩方法及其系统实现 DEntre 基于插桩系统的应用开发 技术热点 龙芯发展介绍. 软硬件的发展趋势. 硬件方面 随着超线程、多核等新技术的出现,硬件的复杂度越来越高。 软件方面 软件的发展呈现越来越抽象的趋势。 软件无法充分利用硬件提供的资源,软硬件之间的性能鸿沟越来越宽。. 程序分析优化层次.
E N D
LUG SEntre:基于龙芯的动态二进制插桩 彭 飞 龙芯合肥研发
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用开发 • 技术热点 • 龙芯发展介绍
软硬件的发展趋势 • 硬件方面 • 随着超线程、多核等新技术的出现,硬件的复杂度越来越高。 • 软件方面 • 软件的发展呈现越来越抽象的趋势。 • 软件无法充分利用硬件提供的资源,软硬件之间的性能鸿沟越来越宽。
龙芯系列处理器 龙芯1A和1B是一款32位SoC芯片。能够满足超低价位云终端、工业控制/数据采集、网络设备、消费类电子等领域需求。 龙芯2F集成64位处理器核,主频达到800MHz,具有很高的性能功耗比。龙芯2F主要用于个人计算机、行业终端、工业控制/数据采集、网络安全等领域。 龙芯3B是首款国产商用8核处理器,主频达到1GHz,支持向量运算加速,峰值计算能力达到128GFLOPS,具有很高的性能功耗比。龙芯3B主要用于高性能计算机、高性能服务器、数字信号处理等领域。 龙芯3A是首款国产商用4核处理器,主频达到1GHz,峰值计算能力达到16GFLOPS,具有很高的性能功耗比。龙芯3A主要用于低功耗服务器、个人计算机、工业控制、网络安全等领域。
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用开发 • 技术热点 • 龙芯发展介绍
整体插桩方法简介 • 针对的问题 • 针对龙芯系统上轻量级应用的动态分析,提出了运行时整体插桩方法及其系统实现SEntre。 • 插桩方法 • 根据用户定义的插桩模式,对运行时的程序进行一次性插桩,获取程序运行时信息。 • 开放的平台 • 提供标准的对外接口,开发系列工具。 • 支持的平台 • MIPS/Linux,以动态库的形式加载。
整体插桩方法 • 第一步:截获执行权。 • 当应用程序装载到内存中,启动程序开始执行的时候,获取其执行权限。 • 第二步:完成整体插桩。 • 代码拷贝:将代码从原空间拷贝到代码缓存区域 • 插桩:在代码拷贝时进行插桩 • 重定位:对缓存区域中的代码进行重定位 • 第三步:插桩后的代码运行。 • 插桩完成之后,将程序的执行权限交给插桩后的代码,插桩后的代码运行,输出用户需要的插桩信息。
系统实现及框架 • IWC:将代码从原区域拷贝到Code Cache,拷贝的同时进行插桩 • Relocation:对Code Cache中的代码进行重定位(静态) • Retarget:对运行时Code Cache中的代码进行重定位(动态) • Analysis routine:对插桩点的信息进行提取和分析
IWC方法 • 拷贝的同时进行插桩 • 按序遍历整个代码段 • 以插桩点为临界进行拷贝 • 根据插桩模式进行插桩
上下文切换 • 插桩点进行上下文切换 • 上下文的恢复和保存 • 保存的信息包括寄存器和栈
分层次的上下文切换方法 • 优点 • (1)第二层代码重用; • (2)第二层功能重用; • (3)第一层较少固定数量的指令有助于代码重定位。
重定位方法 • 重定位指令类型 • 重定位方法 • 第一类:需要在运行时解析(动态) • 第二类、第三类:代码直接修改(静态)
运行时解析 • 类型: • 寄存器相关的函数调用指令,如jalr t9。 • 方法: • 对该指令进行插桩,如图所示。 • 原因: • 函数间的转移,寄存器t9的值需要在运行时刻才能计算出来。
直接跳转的重定位 • 类型: • 指令中包含目标跳转位置,如jal target。 • 方法: • 对指令进行直接修订的重定位方法。 • 原因: • 函数间的转移,目标地址可以静态确定。
分支指令的重定位 • 类型:根据当前指令的位置和偏移,跳转到目标地址,如beq s,t,offset。 • 方法:对指令进行直接修订。 • 原因:模块内的转移,目标偏移可以静态确定。
系统接口 • 三个层次 • 指令集层次 SEntre_is_mem_instruction(insn) • 基本块层次 SEntre_is_bb_begin(insn) • 插桩模式层次 #define SEntre_is_instrumentation_model(insn) \ SEntre_is_mem_instruction(insn)
效率考量 • 高效的内存管理(Code Cache) • 跳转的就地处理 • 高效的上下文切换 • 基于体系结构的优化 • 高效的指令集
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用研究 • 技术热点 • 龙芯发展介绍
交互式插桩方法简介 • 针对的问题 • 针对龙芯系统上重量级应用的动态分析,提出了运行时整体插桩方法及其系统实现DEntre。 • 插桩方法 • 运行时交互式插桩方法采用进程级虚拟机框架,控制每条指令的执行。 • 根据用户定义的插桩模式,程序边运行边进行插桩。 • 开放的平台 • 提供标准的对外接口,开发系列工具。 • 支持的平台 • MIPS/Linux,以动态库的形式加载。
运行时交互式插桩方法 • 第一步:截获执行权。 • 应用程序在启动过程中,插桩系统获取其执行权限。 • 第二步:代码拷贝插桩。 • 以基本块为单位 • 在插桩系统空间执行 • 第三步:插桩后的代码执行 • 插桩后的代码执行 • 在应用程序地址空间执行 • 执行完毕,返回插桩系统,继续第二步工作
分层次的内存管理方法 • 第二层次:堆以16K的固定分配,Code Cache以64K的固定大小分配。 • 第三层次:单元空间管理需要进行大量的数据结构信息的建立和释放, DEntre采用固定大小的数据结构空间分配方法。 • 第三层次:块空间管理方法根据目标基本块的大小分配相应的空间。
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用开发 • 技术热点 • 龙芯发展介绍
运行时基本块频率统计 • 基本块信息的统计需要完成两项重要工作: • 基本块的标识; • 对基本块的插桩统计。
NPB实例分析 • 访存主要集中在三个个区域: • 0x7FDDB7EC附近区域,栈空间 • 0x004150F4附近区域,数据空间 • 0x00654D50附近区域,堆空间
极速仿真器 • 对于专用处理器(ASIP)的指令集仿真,插桩方法拥有极高的效率。
其他应用 • Cache行为仿真 • 根据访存流信息,模拟程序的Cache行为。 • 分支跳转检测 • 检测各跳转的位置及频率。 • 处理器事件提取 • 获取事件寄存器信息。 • 锁Cache机制 • 对于频繁访问的数据或代码,将其锁定在Cache中,提高效率。
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用开发 • 技术热点 • 龙芯发展介绍
Code Cache • 代码缓存是动态运行系统效率的重要保证。 • SEntre的代码缓存采用的是:整体拷贝、整体插装、就地进行重定位。 • 优点: • 效率高,程序在SEntre上运行基本上没有什么效率影响 • 实现相对简单一些 • 缺点: • 运行时失控(out of control),程序一旦在SEntre上运行起来就失去了控制,不能有效的根据程序的动态信息进行插装 • 耗内存,两份代码段
透明性维护(一) • 程序在SEntre上运行时,两者是共享同一虚拟地址空间。 • 栈维护 • 应用程序和SEntre共享同一栈空间,当应用程序和SEntre进行函数调用的时候,需要小心的维护,包括寄存器的值、参数传递等。 • 库函数的透明性 • SEntre不跟踪到应用程序调用的库函数,所以SEntre直接使用C库中的函数,而不是进行系统调用,不会出现函数重入问题。
透明性维护(二) • 堆维护 • 应用程序和SEntre共享同一堆分配函数 • 数据的透明性 • 应用程序的数据部分保持不变,大大减小透明新维护成本。
编译器相关 • 编译器在生成汇编程序的时候,会生成一些上下文耦合性比较大的代码。 400a04: 8fdc0010 lw gp,16(s8) 400a08: 00000000 sll zero,zero,0x0 400a0c: 8f84808c lw a0,-32628(gp) 400a10: 24050400 li a1,1024 400a14: 00003021 move a2,zero 400a18: 8f998058 lw t9,-32680(gp) 400a1c: 00000000 sll zero,zero,0x0 400a20: 0320f809 jalr t9 00400f50 <input_dsp>: 400f50: 3c1c0002 lui gp,0x2 400f54: 279c8b70 addiu gp,gp,-29840 400f58: 0399e021 addu gp,gp,t9 400f5c: 27bdffc8 addiu sp,sp,-56
体系结构的挑战 • 指令集编码和解码 • 精简指令集 • 延迟槽问题 • 分支延迟槽中不能插桩
多线程的支持 • 多线程的支持 • 锁的设计 • 共享资源
主要内容 • 背景介绍 • 基于龙芯的动态二进制插桩方法 • 运行时整体插桩方法及系统实现SEntre • 运行时交互式插桩方法及其系统实现DEntre • 基于插桩系统的应用开发 • 技术热点 • 龙芯发展介绍
中科龙芯 • 2001年5月,计算所龙芯课题组成立,完成龙芯1号、2号芯片研发; • 2008年3月,在北京成立公司,产业化探索。 • 2009年9月,龙芯3A流片成功。 • 2011年5月,公司更名龙芯中科技术有限公司。 • 分基地 • 广州分公司 • 苏州中科龙梦 • 重庆分公司 • 合肥研发中心
合肥研发中心 • 依托中科大先进技术研究院成立中科大龙芯联合实验室。 • 专注龙芯软件研发,包括系统级软件和应用级软件。如编译器、程序分析软件、浏览器等。
联系方式 彭飞 pfgenyun@gmail.com pfgenyun@mail.ustc.edu.cn 15256533629