国内响应式网站模板,WordPress文章资讯主题,扒站wordpress主题,唐山网站开发公司排行榜 收藏 打印 发给朋友 举报发布者#xff1a;jackzhang热度112票 浏览1257次 【共0条评论】【我要评论】时间#xff1a;2014年1月08日 11:04关于Xilinx Zynq-7000带来的新的系统设计思路#xff0c;以及Profiling的对象libjpeg#xff0c;前文已经描述过了#xff… 排行榜 收藏 打印 发给朋友 举报发布者jackzhang 热度112票 浏览1257次 【共0条评论】【我要评论】时间2014年1月08日 11:04 关于Xilinx Zynq-7000带来的新的系统设计思路以及Profiling的对象libjpeg前文已经描述过了再此不再赘述。 一. Oprofile简介 Profiling是对不同性能特征的数据的形式化总结或分析它通常以图形和表的形式出现。它提供为特定的处理器事件收集的采样百分数或数量比如cache miss rate、TLB miss rate等等。一般来说主要目的是为了找出软件中的性能瓶颈然后有针对性的优化以提升软件的整体性能。 Oprofile 是用于 Linux 的若干种评测和性能监控工具中的一种。它可以工作在不同的体系结构上包括ARM, PowerPC, MIPS, IA32, IA64 和 AMD Athlon等等。它的开销很小从Linux 2.6 版起它被包含进了Linux内核中。 Oprofile可以收集有关处理器事件的信息帮助用户识别诸如循环的展开、cache的使用率低、低效的类型转换和冗余操作、错误预测转移等问题。Oprofile是一种细粒度的工具可以为指令集或者为函数、系统调用或中断处理例程收集采样。Oprofile 通过取样来工作。使用收集到的评测数据用户可以很容易地找出性能问题。 通过监察CPU的hardware eventsoprofile可以在运行状态下对整个Linux系统进行profiling。Profiling的对象可以是Linux kernel (包括modules和interrupt handlers), shared libraries或者应用程序。 从0.9.8版本开始oprofile支持Perf_events profiling mode模式。应用程序operf被用来控制profiling过程而在legacy mode下是通过opcontrol脚本和oprofiled daemon来完成的。Operf不再象legacy mode那样需要OProfile kernel driver它直接和Linux Kernel Performance Events Subsystem打交道。使用operf就可以用普通用户的身份来profiling用户的应用程序了当然如果需要对整个系统来profiling的时候还是需要root权限的。 如果硬件不支持OProfile使用performance countersOProfile就只能工作在Timer Mode下了。Timer Mode只能在legacy profiling mode下使用即只能通过opcontrol脚本来控制。 Oprofile的website为http://oprofile.sourceforge.net/ 可以支持的处理器的hardware event类型http://oprofile.sourceforge.net/docs/ 对于Zynq-7000来说http://oprofile.sourceforge.net/docs/armv7-ca9-events.php 列出了ARM Cortex-A9内核PMU(Performance Monitor Unit)所支持的所有hardware event种类可以看出oprofile可以支持很多深入处理器内部的分析。 http://oprofile.sourceforge.net/examples/ 提供了一些oprofile生成的结果可以方便开发者在开始使用之前了解oprofile能够做到哪些事情。 Oprofile的详细使用文档http://oprofile.sourceforge.net/doc/index.html Oprofile的优势 Ÿ 比较低的运行开销 Ÿ 对被profiling的对象影响很小 Ÿ 可以profiling中断服务程序(interrupt handlers) Ÿ 可以profiling应用程序和shared libraries Ÿ 可以profiling dynamically compiled (JIT) code Ÿ 可以对整个系统做profiling Ÿ 可以观察CPU内部的细节例如cache miss rate Ÿ 可以多源代码做annotation Ÿ 可以支持instruction-level的profiling Ÿ 可以生成call-graph profiles 不过OProfile也不是万能的它也有自己的局限性 Ÿ 只能在x86, ARM, 和PowerPC架构上生成call graph profiles Ÿ 不支持100%精确的instruction-level profiling Ÿ 对dynamically compiled (JIT) code profiling的支持还不完善。 无论如何Oprofile的功能都比gprof要强很多代价是配置起来会比较麻烦。 二. 编译Oprofile 首先最好在Linux kernel里面选中Oprofile driver以获得全面的支持。 下载Linux kernel Source从https://github.com/Xilinx/linux-xlnx 可以下载到Xilinx提供的验证好的内核。如果不方便使用Linux下的git工具可以单击页面上的releases找到相应的版本下载tar ball。下载的时候最好选tar.gz格式的而不是zip格式的因为后者在处理symbol link的时候有可能会出问题。 因为笔者使用的是Xilinx Linux pre-built 14.7所以这里下载的是linux-xlnx-xilinx-v14.7.tar.gz 解压缩后用以下命令调出Linux kernel的配置界面 export ARCHarm export CROSS_COMPILEarm-xilinx-linux-gnueabi- make xilinx_zynq_defconfig make xconfig 或者make menuconfig 在配置界面上将以下两项勾上 General setup --- [*] Profiling support * OProfile system profiling 然后make uImage即可生成新的uImage用来替换Xilinx Linux pre-built 14.7中的Linux kernel image。同时我们也需要vmlinux来检查profiling的结果。 Oprofile需要popt, bfd, liberty库要在嵌入式单板上使用这些库需要手工完成交叉编译。 针对popt 1.7用以下命令完成编译 ./configure --prefix/home/wave/xilinx/oprofileprj/rootfs --hostarm-xilinx-linux-gnueabi --with-kernel-support --disable-nls make make install 针对binutils 2.24用以下命令完成编译 ./configure --hostarm-xilinx-linux-gnueabi --prefix/home/wave/xilinx/oprofileprj/rootfs --enable-install-libbfd --enable-install-libiberty --enable-shared make make install 不过--enable-install-libiberty没有效果所以需要手工把libiberty.a和libiberty.h拷贝到相应的位置。 针对oprofile 0.9.9用以下命令完成编译 ./configure --hostarm-xilinx-linux-gnueabi --prefix/home/wave/xilinx/oprofileprj/rootfs --with-kernel-support --with-binutils/home/wave/xilinx/oprofileprj/rootfs make make install 配置过程结束后可能会有以下提示因为没有打算用GUI和profile JITed code所以直接忽视之。 config.status: executing libtool commands Warning: QT version 3 was requested but not found. No GUI will be built. Warning: The user account oprofile:oprofile does not exist on the system. To profile JITed code, this special user account must exist. Please ask your system administrator to add the following user and group: user name : oprofile group name: oprofile The oprofile group must be the default group for the oprofile user. 将编译完成的uImagevmlinuxoprofile binary重新编译的没有-pg的libjpeg binary以及tool chain的libc打包放到SD卡中准备在ZC706开发板上尝试profile djpeg。 三. 运行Oprofile 正常启动嵌入式Linux后在开发板的console上一次输入以下命令 mount /dev/mmcblk0p1 /mnt mkdir -p /home/root/work cd /home/root/work tar zxvf /mnt/jpeg-bin-nopg.tar.gz cd jpeg-bin/bin cp /mnt/park-2880x1800.jpg . export LD_LIBRARY_PATH/home/root/work/jpeg-bin/lib cd /home/root/work tar zxvf /mnt/rootfs.tar.gz cd rootfs chown root:root -R * cp -R bin/* /usr/bin cp -R lib/* /lib cp /bin/which /usr/bin cp /bin/dirname /usr/bin mkdir -p /home/wave/xilinx/oprofileprj/rootfs/share cp -R ./rootfs/* /home/wave/xilinx/oprofileprj/rootfs cd /home/root/work tar zxvf /mnt/libc.tar.gz cp ./lib/libstdc*.* /lib mkdir -p /home/wave/xilinx/libjpeg cd /home/wave/xilinx/libjpeg tar zxvf /mnt/jpeg-9.tar.gz cp /mnt/vmlinux /home/root/work cd /home/root/work/jpeg-bin/bin opcontrol --init opcontrol --vmlinux/home/root/work/vmlinux opcontrol --setup --eventCPU_CYCLES:100000::0:1 --session-dir/home/root/ operf --vmlinux /home/root/work/vmlinux ./djpeg -bmp park-2880x1800.jpg result.bmp opreport -l ./djpeg 完成这一步后我们就可以看到profiling的结果了在笔者的平台上看到的内容的主要部分如下 rootzynq:~/work/jpeg-bin/bin# opreport -l ./djpeg Using /home/root/work/jpeg-bin/bin/oprofile_data/samples/ for samples directory. CPU: ARM Cortex-A9, speed 666667 MHz (estimated) Counted CPU_CYCLES events (CPU cycle) with a unit mask of 0x00 (No unit mask) count 100000 samples % image name symbol name 15293 58.6253 libc-2.17.so /lib/libc-2.17.so 2044