国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

wKgZO2kal-aAEi4gAAh6kwqQrrc287.png

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

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

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

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

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

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

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

2.perf record:采樣與熱點分析

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

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

?中斷處理:計數(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ù)寫入文件,后續(xù)可通過perf report解析熱點函數(shù)。

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

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

現(xiàn)象

執(zhí)行perf stat -e l1d_cache_misses ./app報錯,事件無法識別。

排查流程

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

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

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

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

現(xiàn)象

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

排查流程

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

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

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

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

現(xiàn)象

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

排查流程

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

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

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

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

為新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.實現(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.注冊處理器初始化函數(shù)

通過宏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ò)展硬件探測邏輯

__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)控工具開發(fā):基于代碼的能力擴(kuò)展

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

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

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

2.計數(shù)讀取(read

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

3.采樣處理(mmap

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

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

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

wKgZO2kal-aAVkbkAAAX0h4K-rI701.png

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

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

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

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

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

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

wKgZO2kal-eAE9BiAAIe0E4sf4k912.png

七、總結(jié)

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

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

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

    關(guān)注

    0

    文章

    96

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73965
  • ARMv8
    +關(guān)注

    關(guān)注

    1

    文章

    37

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

    請問如何理解ARMv8內(nèi)存屬性device中,引入的Re-Ordering概念,感覺實際意義不大。或者可以舉個例子來說明這個概念的必要性。謝謝!
    發(fā)表于 07-28 17:19

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

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

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

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

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

    ,大大提升了處理器的性能目前的的了解來看,基本上 ARMv8 與上代架構(gòu)的差別是非常大的。除了 A64 指令集之外,還有許多地方都有較大改動,下面列出幾個目前比較關(guān)注的點:  · 執(zhí)行狀態(tài)與異常級別
    發(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問題該如何更好地去理解呢

    假定一個ARMv8 SOC實現(xiàn)了4個EL:EL0 / EL1 / EL2 / EL3根據(jù)ARMv8 ARM手冊:每一個EL,都有自己對應(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位元市場。ARMv8ARMv7架構(gòu)為基礎(chǔ),并內(nèi)含64位元指令集,預(yù)估可將32/64位元應(yīng)用優(yōu)勢極大化。
    發(fā)表于 11-01 09:32 ?1779次閱讀

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

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

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

    EL2的名稱集成特權(quán)級系統(tǒng)中。同時,此模式僅解決與CPU訪問內(nèi)存和外圍設(shè)備等系統(tǒng)資源相關(guān)的問題。為了提高虛擬環(huán)境中設(shè)備啟動的事務(wù)處理效率,已經(jīng)為基于ARMv8的系統(tǒng)開發(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):處理器運行時的環(huán)境,包括寄存器的位寬、支持的指令集、異常模型、內(nèi)存管理及編程模型等。ARMv8體系結(jié)構(gòu)定義了兩個執(zhí)行狀態(tài): AArch64:64位的執(zhí)行狀態(tài) 提供31個64位的通用寄存
    的頭像 發(fā)表于 04-16 10:45 ?8641次閱讀

    ARMv8工作模式有哪些

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

    armv8 u-boot的啟動介紹

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

    u-boot armv8鏈接腳本

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

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

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