91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從代碼到實(shí)踐:ARMv8 PMUv3性能監(jiān)控的實(shí)際應(yīng)用解析

jf_44130326 ? 來(lái)源:Linux1024 ? 2026-02-04 17:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文結(jié)合perf_event.c代碼片段,聚焦實(shí)際開(kāi)發(fā)場(chǎng)景,將通過(guò)以下內(nèi)容展開(kāi):

1.perf工具與代碼的底層關(guān)聯(lián)邏輯及用法

2.常見(jiàn)問(wèn)題(事件不支持、計(jì)數(shù)不準(zhǔn)等)的排查案例

3.處理器適配與定制化監(jiān)控的實(shí)現(xiàn)方式

4.用戶態(tài)性能監(jiān)控工具開(kāi)發(fā)要點(diǎn)

5.調(diào)試流程與代碼關(guān)聯(lián)的可視化解析(含流程圖)

6.核心內(nèi)容腦圖梳理

wKgZO2kal-aAEi4gAAh6kwqQrrc287.png

一、性能工具的幕后推手perf如何依賴這段代碼?

perf工具的所有性能統(tǒng)計(jì)與采樣功能,均依賴perf_event.c實(shí)現(xiàn)的硬件交互邏輯,核心關(guān)聯(lián)場(chǎng)景如下:

1.perf stat:基礎(chǔ)性能計(jì)數(shù)

perf stat -e cpu-cycles ./app為例,代碼執(zhí)行流程:

?事件映射armv8_pmuv3_map_event將上層cpu-cyclesPERF_COUNT_HW_CPU_CYCLES)映射為硬件事件ARMV8_PMUV3_PERFCTR_CPU_CYCLES

?計(jì)數(shù)器分配armv8pmu_get_event_idx優(yōu)先為周期事件分配專屬64位計(jì)數(shù)器(ARMV8_IDX_CYCLE_COUNTER)。

?計(jì)數(shù)控armv8pmu_enable_event配置計(jì)數(shù)器類型(armv8pmu_write_event_type)并啟動(dòng)計(jì)數(shù);程序結(jié)束后,armv8pmu_read_counter讀取值,經(jīng)armv8pmu_unbias_long_counter修正偏置后返回給perf。

2.perf record:采樣與熱點(diǎn)分析

perf record -e instructions -c 1000000 ./app(每百萬(wàn)條指令采樣)為例:

?溢出配置armv8pmu_write_counter設(shè)置計(jì)數(shù)器初始值(0x1000000 - 1000000),確保觸發(fā)溢出中斷。

?中斷處理:計(jì)數(shù)器溢出后,armv8pmu_handle_irq讀取溢出狀態(tài)(pmovsclr_el0),暫停PMU避免數(shù)據(jù)skew,調(diào)用perf_event_overflow生成采樣數(shù)據(jù)(含指令地址、寄存器狀態(tài))。

?數(shù)據(jù)輸出:采樣數(shù)據(jù)寫(xiě)入文件,后續(xù)可通過(guò)perf report解析熱點(diǎn)函數(shù)。

二、實(shí)際開(kāi)發(fā)中的問(wèn)題排查:從現(xiàn)象到代碼

案例1perf提示“event not supported”(事件不支持)

現(xiàn)象

執(zhí)行perf stat -e l1d_cache_misses ./app報(bào)錯(cuò),事件無(wú)法識(shí)別。

排查流程

1.確認(rèn)事件映射:檢查armv8_pmuv3_perf_cache_map,L1D讀未命中事件是否映射為ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL(代碼中[C(L1D)][C(OP_READ)][C(RESULT_MISS)]的配置)。

2.驗(yàn)證硬件支持armv8pmu_probe_pmu通過(guò)pmceid0_el0/pmceid1_el0寄存器生成pmceid_bitmap,若ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL對(duì)應(yīng)的bit未置位,說(shuō)明硬件不支持該事件。

3.處理器專屬適配:若為特定處理器(如Cortex-A53),檢查armv8_a53_perf_cache_map是否補(bǔ)充了該事件的非通用映射(部分處理器事件定義與標(biāo)準(zhǔn)不同)。

案例2:計(jì)數(shù)結(jié)果遠(yuǎn)小于預(yù)期(64位計(jì)數(shù)器異常)

現(xiàn)象

監(jiān)控長(zhǎng)時(shí)間運(yùn)行程序,cpu-cycles計(jì)數(shù)僅為1e6(遠(yuǎn)低于CPU頻率×運(yùn)行時(shí)間)。

排查流程

1.64位事件判斷:通過(guò)armv8pmu_event_is_64bit確認(rèn)事件是否啟用64位計(jì)數(shù);若硬件不支持原生64位(armv8pmu_has_long_event返回false),需檢查鏈?zhǔn)接?jì)數(shù)器邏輯(armv8pmu_write_hw_counter中高低32位拼接是否正確)。

2.偏置處理驗(yàn)證armv8pmu_bias_long_counter需為32位計(jì)數(shù)器置位高32位(value |= GENMASK(63, 32)),若遺漏會(huì)導(dǎo)致高位丟失;armv8pmu_unbias_long_counter需清除高32位,確保上層讀取正確。

3.中斷完整性armv8pmu_handle_irq需同時(shí)處理鏈?zhǔn)接?jì)數(shù)器的高低位溢出,若僅處理高位,會(huì)導(dǎo)致計(jì)數(shù)不連續(xù)。

案例3:用戶態(tài)程序無(wú)法讀取計(jì)數(shù)器(權(quán)限問(wèn)題)

現(xiàn)象

自定義工具通過(guò)perf_event_open打開(kāi)事件后,讀取計(jì)數(shù)返回0或權(quán)限錯(cuò)誤。

排查流程

1.用戶訪問(wèn)開(kāi)關(guān):檢查sysctl_perf_user_access(通過(guò)sysctl kernel.perf_user_access查看),需設(shè)為1以允許用戶態(tài)訪問(wèn)(對(duì)應(yīng)代碼中armv8_pmu_sysctl_table的配置)。

2.寄存器配置armv8pmu_enable_user_access需設(shè)置pmuserenr_el0寄存器(ARMV8_PMU_USERENR_ER | ARMV8_PMU_USERENR_CR),若未配置,用戶態(tài)讀取會(huì)觸發(fā)陷阱。

3.事件標(biāo)記:事件需帶有PERF_EVENT_FLAG_USER_READ_CNT標(biāo)記(代碼中event->hw.flags設(shè)置),否則armv8pmu_user_event_idx會(huì)拒絕用戶態(tài)訪問(wèn)。

三、新處理器適配:從代碼到落地

為新ARMv8處理器(如定制化Cortex-A78)適配性能監(jiān)控,需修改以下核心邏輯:

1.新增專屬事件映射

若處理器有特有事件(如“LLC預(yù)取命中),需定義專屬映射表:

// 新處理器專屬緩存事件映射staticconstunsigned armv8_custom_perf_cache_map  [PERF_COUNT_HW_CACHE_MAX]  [PERF_COUNT_HW_CACHE_OP_MAX]  [PERF_COUNT_HW_CACHE_RESULT_MAX] = {  PERF_CACHE_MAP_ALL_UNSUPPORTED,  [C(LLC)][C(OP_PREFETCH)][C(RESULT_HIT)] = CUSTOM_PERFCTR_LLC_PREFETCH_HIT,// 特有事件};

2.實(shí)現(xiàn)事件映射函數(shù)

關(guān)聯(lián)通用映射與專屬映射:

staticintarmv8_custom_map_event(structperf_event *event){ return__armv8_pmuv3_map_event(event, NULL, &armv8_custom_perf_cache_map);}

3.注冊(cè)處理器初始化函數(shù)

通過(guò)宏PMUV3_INIT_SIMPLE綁定初始化邏輯:

PMUV3_INIT_SIMPLE(armv8_custom)// 生成armv8_custom_pmu_init函數(shù)staticintarmv8_custom_pmu_init(structarm_pmu *cpu_pmu){ returnarmv8_pmu_init_nogroups(cpu_pmu,"armv8_custom", armv8_custom_map_event);}

4.擴(kuò)展硬件探測(cè)邏輯

__armv8pmu_probe_pmu中讀取處理器特有寄存器(如pmceid2_el0),擴(kuò)展pmceid_bitmap以支持新事件:

// 新增特有寄存器讀取if(cpu_pmu->pmuver >= ID_AA64DFR0_EL1_PMUVer_V3P6) { u32pmceid2=read_sysreg(pmceid2_el0);  bitmap_from_arr32(cpu_pmu->pmceid_bitmap +64, &pmceid2,32);// 擴(kuò)展bitmap}

四、用戶態(tài)監(jiān)控工具開(kāi)發(fā):基于代碼的能力擴(kuò)展

若需開(kāi)發(fā)輕量用戶態(tài)工具(替代perf部分功能),可基于以下代碼邏輯設(shè)計(jì)核心流程:

1.事件創(chuàng)建(perf_event_open

?工具調(diào)用perf_event_open傳入事件類型(如PERF_COUNT_HW_CPU_CYCLES),內(nèi)核調(diào)用armv8pmu_get_event_idx分配計(jì)數(shù)器,armv8pmu_set_event_filter設(shè)置過(guò)濾條件(如僅監(jiān)控用戶態(tài):config_base |= ARMV8_PMU_EXCLUDE_EL1)。

2.計(jì)數(shù)讀?。?/span>read

?工具通過(guò)read系統(tǒng)調(diào)用讀取計(jì)數(shù),內(nèi)核最終調(diào)用armv8pmu_read_counter,經(jīng)armv8pmu_unbias_long_counter修正后返回值。

3.采樣處理(mmap

?若設(shè)置采樣周期(attr.sample_period),計(jì)數(shù)器溢出時(shí),armv8pmu_handle_irq生成采樣數(shù)據(jù)并寫(xiě)入mmap共享內(nèi)存,工具可實(shí)時(shí)讀取解析(如獲取熱點(diǎn)指令地址)。

五、調(diào)試流程可視化:從問(wèn)題到代碼的映射

針對(duì)計(jì)數(shù)偏小這一高頻問(wèn)題,結(jié)合代碼邏輯的調(diào)試流程如下,每個(gè)節(jié)點(diǎn)均標(biāo)注了需重點(diǎn)關(guān)注的函數(shù)與寄存器:

wKgZO2kal-aAVkbkAAAX0h4K-rI701.png

流程圖關(guān)鍵說(shuō)明

1.64位事件判斷armv8pmu_event_is_64bit通過(guò)事件類型(如PERF_COUNT_HW_CPU_CYCLES)和硬件能力(armv8pmu_has_long_event)決定是否啟用鏈?zhǔn)接?jì)數(shù)。

2.鏈?zhǔn)接?jì)數(shù)器拼接armv8pmu_write_hw_counter需將64位周期值拆分為高低32位,分別寫(xiě)入兩個(gè)通用計(jì)數(shù)器(如PMCCNTR_EL0的擴(kuò)展計(jì)數(shù)器)。

3.中斷處理驗(yàn)證armv8pmu_handle_irq需讀取pmovsr(溢出狀態(tài)寄存器),確認(rèn)高低位計(jì)數(shù)器的溢出標(biāo)志均被處理,避免漏計(jì)。

4.32位偏置修正armv8pmu_bias_long_counter置位高32位是為了防止32位計(jì)數(shù)器溢出時(shí),符號(hào)擴(kuò)展導(dǎo)致的數(shù)值錯(cuò)誤(如0xFFFFFFFE被解析為- 2而非4294967294)。

六、核心內(nèi)容腦圖梳理

wKgZO2kal-eAE9BiAAIe0E4sf4k912.png

七、總結(jié)

perf_event.c不僅是perf工具的底層支撐,更是ARMv8性能監(jiān)控的實(shí)操手冊(cè)。其核心價(jià)值在于將硬件PMU的復(fù)雜特性(如64位計(jì)數(shù)、中斷溢出)封裝為上層可調(diào)用的接口,而調(diào)試的關(guān)鍵則是打通現(xiàn)象代碼硬件的鏈路——例如從計(jì)數(shù)偏小定位到armv8pmu_write_hw_counter的拼接邏輯,從權(quán)限錯(cuò)誤關(guān)聯(lián)到pmuserenr_el0寄存器配置。

掌握這些細(xì)節(jié)后,開(kāi)發(fā)者不僅能高效解決perf工具的使用問(wèn)題,更能基于此實(shí)現(xiàn)定制化監(jiān)控(如新增處理器特有事件、開(kāi)發(fā)輕量用戶態(tài)工具),最終從工具使用者升級(jí)為性能調(diào)優(yōu)專家,為ARMv8平臺(tái)的系統(tǒng)優(yōu)化提供堅(jiān)實(shí)支撐。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    96

    瀏覽量

    11479
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73956
  • ARMv8
    +關(guān)注

    關(guān)注

    1

    文章

    37

    瀏覽量

    14702
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ARM重新定義ARMv8新架構(gòu),ARMv8新架構(gòu)特性解說(shuō)

    本文ARMv8-A產(chǎn)生的背景開(kāi)始,對(duì)它進(jìn)行一個(gè)簡(jiǎn)單的介紹,使大家整體上,對(duì)ARMv8有一個(gè)簡(jiǎn)單的了解。
    的頭像 發(fā)表于 10-08 17:02 ?1.2w次閱讀
    ARM重新定義<b class='flag-5'>ARMv8</b>新架構(gòu),<b class='flag-5'>ARMv8</b>新架構(gòu)特性解說(shuō)

    請(qǐng)問(wèn)如何理解ARMv8內(nèi)存屬性device

    請(qǐng)問(wèn)如何理解ARMv8內(nèi)存屬性device中,引入的Re-Ordering概念,感覺(jué)實(shí)際意義不大?;蛘呖梢耘e個(gè)例子來(lái)說(shuō)明這個(gè)概念的必要性。謝謝!
    發(fā)表于 07-28 17:19

    一文幫你梳理Cortex與ARMv8等基礎(chǔ)概念

    到底什么是Cortex、ARMv8、arm架構(gòu)、ARM指令集、soc?一文幫你梳理基礎(chǔ)概念【科普】1. 0開(kāi)始學(xué)ARM-安裝Keil MDK uVision集成開(kāi)發(fā)環(huán)境
    發(fā)表于 12-14 08:20

    怎樣在PC機(jī)器上編譯RK3566 ARMv8平臺(tái)的代碼

    什么是交叉編譯呢?怎樣在PC機(jī)器上編譯RK3566 ARMv8平臺(tái)的代碼呢?
    發(fā)表于 03-02 09:49

    ARMv8架構(gòu)資料分享

    ,大大提升了處理器的性能。目前的的了解來(lái)看,基本上 ARMv8 與上代架構(gòu)的差別是非常大的。除了 A64 指令集之外,還有許多地方都有較大改動(dòng),下面列出幾個(gè)目前比較關(guān)注的點(diǎn):  · 執(zhí)行狀態(tài)與異常級(jí)別
    發(fā)表于 03-21 14:50

    ARMv8架構(gòu)概述

    的虛擬地址映射,也就是最大支持256TB的內(nèi)存管理。ARMv8的MMU支持4KB和64KB兩種page size?!?4KB and 4 levels => 48-bit VA● 64KB and 3
    發(fā)表于 05-13 10:31

    ARMv8 Vector table問(wèn)題該如何更好地去理解呢

    假定一個(gè)ARMv8 SOC實(shí)現(xiàn)了4個(gè)EL:EL0 / EL1 / EL2 / EL3根據(jù)ARMv8 ARM手冊(cè):每一個(gè)EL,都有自己對(duì)應(yīng)的Vector Table.那么:EL0 / EL1 / EL2
    發(fā)表于 08-17 15:54

    ARM推新品:ARMv8首次支援64位元指令集

    處理器授權(quán)大廠ARM于上周(10/27)公布最新處理器規(guī)格ARMv8架構(gòu),一舉將其產(chǎn)品線推入64位元市場(chǎng)。ARMv8ARMv7架構(gòu)為基礎(chǔ),并內(nèi)含64位元指令集,預(yù)估可將32/64位元應(yīng)用優(yōu)勢(shì)極大化。
    發(fā)表于 11-01 09:32 ?1779次閱讀

    軟件開(kāi)發(fā)的角度概述ARMv8處理器架構(gòu)中的虛擬化操作

    的一部分,并且已經(jīng)以名稱EL2集成特權(quán)級(jí)系統(tǒng)中。同時(shí),該模式僅解決與CPU訪問(wèn)系統(tǒng)資源相關(guān)的問(wèn)題,例如存儲(chǔ)器和外圍設(shè)備。為了提高虛擬化環(huán)境中設(shè)備啟動(dòng)的事務(wù)的效率,已經(jīng)為基于ARMv8的系統(tǒng)開(kāi)發(fā)了許多組件,例如新的中斷控制器和IOMMU。本文
    發(fā)表于 10-13 20:00 ?1262次閱讀
    <b class='flag-5'>從</b>軟件開(kāi)發(fā)的角度概述<b class='flag-5'>ARMv8</b>處理器架構(gòu)中的虛擬化操作

    ARMv8處理器體系結(jié)構(gòu)中的虛擬化功能

    EL2的名稱集成特權(quán)級(jí)系統(tǒng)中。同時(shí),此模式僅解決與CPU訪問(wèn)內(nèi)存和外圍設(shè)備等系統(tǒng)資源相關(guān)的問(wèn)題。為了提高虛擬環(huán)境中設(shè)備啟動(dòng)的事務(wù)處理效率,已經(jīng)為基于ARMv8的系統(tǒng)開(kāi)發(fā)了許多組件,例如新的中斷控制器和IOMMU。本文系統(tǒng)軟件
    發(fā)表于 05-13 10:48 ?2571次閱讀
    <b class='flag-5'>ARMv8</b>處理器體系結(jié)構(gòu)中的虛擬化功能

    Armv8架構(gòu)及虛擬化介紹

    ARMv8基本概念 (1)執(zhí)行狀態(tài)(execution state):處理器運(yùn)行時(shí)的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理及編程模型等。ARMv8體系結(jié)構(gòu)定義了兩個(gè)執(zhí)行狀態(tài): AArch64:64位的執(zhí)行狀態(tài) 提供31個(gè)64位的通用寄存
    的頭像 發(fā)表于 04-16 10:45 ?8637次閱讀

    ARMv8工作模式有哪些

    ),虛擬機(jī)管理器 EL3:最底層的安全固件,如 ARM Trusted Firmware(ATF/TF-A) ARMv8 提供了兩種安全狀態(tài):Secure 和 Non-secure,也就是安全和非安全,Non-secure 也就是正常
    的頭像 發(fā)表于 09-11 16:34 ?3069次閱讀
    <b class='flag-5'>ARMv8</b>工作模式有哪些

    armv8 u-boot的啟動(dòng)介紹

    先看arm官網(wǎng)提供的一張圖: 上圖詳細(xì)概括了arm官方推薦的armv8的啟動(dòng)層次結(jié)構(gòu): 官方將啟動(dòng)分為了BL1,BL2,BL31,BL32,BL33階段,根據(jù)順序,芯片啟動(dòng)后首先執(zhí)行BL1階段代碼
    的頭像 發(fā)表于 12-07 11:09 ?4311次閱讀
    <b class='flag-5'>armv8</b> u-boot的啟動(dòng)介紹

    u-boot armv8鏈接腳本

    u-boot armv8鏈接腳本 在進(jìn)行源碼分析之前,首先看看u-boot的鏈接腳本,通過(guò)鏈接腳本可以整體了解一個(gè)u-boot的組成,并且可以在啟動(dòng)分析中知道某些邏輯是在完成什么工作。 在
    的頭像 發(fā)表于 12-07 11:19 ?1547次閱讀

    ARMv8體系結(jié)構(gòu)入門(附流程圖+腦圖)

    ARMv8是 手機(jī)、平板、甚至部分服務(wù)器里處理器的“底層設(shè)計(jì)藍(lán)圖” ——它是ARM公司推出的第一代支持64位計(jì)算的架構(gòu),能讓設(shè)備同時(shí)用大內(nèi)存、跑新程序和舊程序。下面用“大白話+圖”拆解它的核心邏輯
    的頭像 發(fā)表于 01-06 07:03 ?672次閱讀
    <b class='flag-5'>ARMv8</b>體系結(jié)構(gòu)入門(附流程圖+腦圖)