【KERNEL中的PERF交叉编译】

一、依赖的库:

       1、zlib:

       2、elfutils:

       3、binutils:

二、修改kernel:

        1、kernel/tools/perf/Makefile.perf文件:

EXTRA_CFLAGS=-I/data/luwei/others/perf/elfutils-0.188/output/include -L/data/luwei/others/perf/elfutils-0.188/output/lib -I/data/luwei/others/perf/binutils-2.28.1/output/include -L/data/luwei/others/perf/binutils-2.28.1/output/lib

WERROR=0
NO_LIBPERL=1
NO_LIBPYTHON=1

最开头增加上面的信息;

        2、kernel/tools/lib/bpf/Makefile文件:

INCLUDES增加-I/data/luwei/others/perf/elfutils-0.188/output/include

        3、tools/lib/traceevent/Makefile文件:

找到

$(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\,

将其注释,在下一行添加

$(NM) -u -D $1 | awk -F '[ |\t|@]+' 'NF>1 {print "\t"$$3";"}' | sort -u;\

        4、将elfutils中编译出来的libelf.so去掉,使其链接的时候使用libelf.a静态库;

        5、交叉编译perf:

               make -f Makefile.perf perf ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabi-

        6、strip perf:

              最终得到perf。

三、内核支持pmu性能:

        dts中增加compatible = "arm,cortex-a17-pmu"的pmu设备节点,我们使用rk3568的armv7(a17核),使perf支持硬件pmu特性:
---------------------------------------------------------------------------------------------------------------------------------

1、分支预测相关事件:
     br_immed_retired‌:已退休的立即分支指令数量(直接跳转指令)。
‌     br_mis_pred‌:分支预测错误的次数。
‌     br_pred‌:分支预测的总次数(包括正确和错误)。
‌     br_return_retired‌:已退休的函数返回指令数量(如 BX LR)。
这些事件用于分析分支预测器的效率。例如,高 br_mis_pred 可能表明分支预测逻辑需要优化。

2、总线与内存访问事件:
     bus_access‌:总线访问次数。
     ‌bus_cycles‌:总线活跃周期数。
     ‌mem_access‌:内存访问次数。
‌     memory_error‌:内存访问错误次数(如对齐错误)。
用于监控内存子系统的性能瓶颈或错误。

3、指令执行事件:
     cpu_cycles‌:CPU 总周期数(衡量 CPU 负载)。
     ‌inst_retired‌:已退休的指令总数。
     ‌inst_spec‌:推测执行的指令数(可能被丢弃)。
     ‌ld_retired‌:已退休的加载指令数。
     ‌st_retired‌:已退休的存储指令数。
     ‌unaligned_ldst_retired‌:未对齐的加载/存储指令。
反映 CPU 的指令吞吐量和执行效率。

4、缓存相关事件:
     ‌1)、L1 数据缓存‌:
‌     l1d_cache‌:L1 数据缓存访问次数。
‌     l1d_cache_refill‌:L1 数据缓存未命中后从下级缓存/内存填充的次数。
     ‌l1d_cache_wb‌:L1 数据缓存写回次数。
     ‌l1d_tlb_refill‌:L1 数据 TLB 未命中后填充的次数。

     2)、‌L1 指令缓存‌:
     ‌l1i_cache‌:L1 指令缓存访问次数。
     ‌l1i_cache_refill‌:L1 指令缓存未命中后填充的次数。
‌     l1i_tlb_refill‌:L1 指令 TLB 未命中后填充的次数。

     3)、L2 缓存‌:
     ‌l2d_cache‌:L2 数据缓存访问次数。
‌     l2d_cache_refill‌:L2 数据缓存未命中后填充的次数。
‌     l2d_cache_wb‌:L2 数据缓存写回次数。
用于分析缓存命中率和内存延迟问题。

5、其他事件:
     cid_write_retired‌:已退休的上下文 ID 写入指令数(如 MCR 操作)。
‌     exc_return‌:异常返回指令数。
‌     exc_taken‌:异常触发次数。
     ‌pc_write_retired‌:已退休的程序计数器(PC)写入指令数(如分支、跳转)。
     ‌sw_incr‌:软件递增的计数器事件(自定义用途)。
‌     ttbr_write_retired‌:已退休的页表基址寄存器(TTBR)写入指令数。

示例:
1、监视ls命令L1数据缓存未命中率:
./perf stat -e l1d_cache_refill,l1d ls
-------------------------------------------------------------
imgs_temp  lost+found  perf  ramdisk_version  t

 Performance counter stats for 'ls':

             13967      l1d_cache_refill                                            
            381038      l1d                                                         

       0.004646833 seconds time elapsed

       0.005158000 seconds user
       0.000000000 seconds sys

2、监视ls命令总线访问事务:
./perf stat -e bus_access,bus_cycles,mem_access,memory_error ls
------------------------------------------------------------------------------
imgs_temp  lost+found  perf  ramdisk_version  t

 Performance counter stats for 'ls':

            416874      bus_access                                                  
           4454528      bus_cycles                                                  
            548408      mem_access                                                  
                 0      memory_error                                                

       0.004426625 seconds time elapsed

       0.002468000 seconds user
       0.002468000 seconds sys
3、perf性能分析:
    ./perf top -e cpu-clock -p 353
    分析进程353的cpu使用。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值