chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

深入解析ARM架構(gòu)下perf_event相關(guān)模塊的功能與調(diào)用流程

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

掃碼添加小助手

加入工程師交流群

Linux系統(tǒng)性能分析領(lǐng)域,perf工具扮演著至關(guān)重要的角色,而其底層依賴的perf_event相關(guān)模塊更是核心中的核心。本文將圍繞perf_event.c、perf_regs.cperf_callchain.c三個(gè)關(guān)鍵文件,深入解析ARM架構(gòu)下性能監(jiān)控的實(shí)現(xiàn)機(jī)制、核心功能及調(diào)用流程,并重點(diǎn)說明開發(fā)者關(guān)注這部分內(nèi)容的意義與調(diào)試價(jià)值。

一、核心模塊功能概述

1. perf_event.c:性能事件管理的核心

該文件是ARM架構(gòu)下性能監(jiān)控單元(PMU)驅(qū)動(dòng)的核心實(shí)現(xiàn),主要負(fù)責(zé):

?不同ARMv8處理器(如Cortex-A53/A57/A72等)PMU的初始化與設(shè)備探測(cè)

?性能事件的創(chuàng)建、映射、啟用、禁用及計(jì)數(shù)器讀寫

?事件屬性的可見性控制與系統(tǒng)調(diào)用接口實(shí)現(xiàn)

?中斷處理與溢出檢測(cè)等核心邏輯

2. perf_regs.c寄存器數(shù)據(jù)處理

專注于處理性能事件采樣時(shí)的寄存器數(shù)據(jù):

?提供寄存器值的讀取接口,適配32/ 64位環(huán)境

?處理不同特權(quán)級(jí)(EL0/EL1等)下的寄存器訪問

?實(shí)現(xiàn)用戶態(tài)與內(nèi)核態(tài)寄存器數(shù)據(jù)的正確映射

3. perf_callchain.c:調(diào)用鏈追蹤

負(fù)責(zé)記錄性能事件發(fā)生時(shí)的函數(shù)調(diào)用鏈:

?實(shí)現(xiàn)內(nèi)核態(tài)與用戶態(tài)調(diào)用鏈的回溯

?處理AArch32/AArch64兩種模式下的棧幀解析

?提供調(diào)用鏈存儲(chǔ)與格式轉(zhuǎn)換功能

二、核心功能模塊解析

1. PMU設(shè)備初始化流程

ARMv8架構(gòu)下不同處理器的PMU初始化通過統(tǒng)一框架實(shí)現(xiàn),以armv8_pmu_init為核心入口:

// 通用初始化函數(shù)staticintarmv8_pmu_init(structarm_pmu *cpu_pmu,char*name,            int(*map_event)(structperf_event *event),            conststructattribute_group *events,            conststructattribute_group *format,            conststructattribute_group *caps) { // 1. 探測(cè)PMU硬件特性 intret = armv8pmu_probe_pmu(cpu_pmu); if(ret)returnret;  // 2. 初始化PMU操作函數(shù)集  cpu_pmu->handle_irq = armv8pmu_handle_irq;  cpu_pmu->enable = armv8pmu_enable_event;  cpu_pmu->disable = armv8pmu_disable_event; // ... 其他函數(shù)賦值  // 3. 設(shè)置名稱與事件映射函數(shù)  cpu_pmu->name = name;  cpu_pmu->map_event = map_event;  // 4. 注冊(cè)屬性組與系統(tǒng)控制表 // ...  armv8_pmu_register_sysctl_table(); return0;}

不同處理器通過特定初始化函數(shù)調(diào)用通用框架:

// Cortex-A53初始化staticintarmv8_a53_pmu_init(structarm_pmu *cpu_pmu){ returnarmv8_pmu_init_nogroups(cpu_pmu,"armv8_cortex_a53",                 armv8_a53_map_event);}// 無特殊屬性組的初始化封裝staticintarmv8_pmu_init_nogroups(structarm_pmu *cpu_pmu,char*name,                int(*map_event)(structperf_event *event)) { returnarmv8_pmu_init(cpu_pmu, name, map_event,NULL,NULL,NULL);}

2.性能事件生命周期管理

事件創(chuàng)建與映射

事件映射是將用戶空間的事件類型(如PERF_COUNT_HW_CPU_CYCLES)轉(zhuǎn)換為硬件可識(shí)別的事件編碼的過程:

// 事件映射核心實(shí)現(xiàn)staticint__armv8_pmuv3_map_event(structperf_event *event, ...) { // 1. 基礎(chǔ)事件映射 inthw_event_id = armpmu_map_event(event, &armv8_pmuv3_perf_map,                   &armv8_pmuv3_perf_cache_map,                   ARMV8_PMU_EVTYPE_EVENT);  // 2. 64位事件標(biāo)記 if(armv8pmu_event_is_64bit(event))   event->hw.flags |= ARMPMU_EVT_64BIT;  // 3. 用戶態(tài)訪問控制 if(armv8pmu_event_want_user_access(event)) {   // 驗(yàn)證權(quán)限與硬件支持   event->hw.flags |= PERF_EVENT_FLAG_USER_READ_CNT;  }  // 4. 檢查事件是否被硬件支持 if((hw_event_id >0) && test_bit(hw_event_id, armpmu->pmceid_bitmap)) {   returnhw_event_id;  } return...;}

事件啟用與禁用

事件啟用過程涉及計(jì)數(shù)器配置、中斷使能等硬件操作:

staticvoidarmv8pmu_enable_event(structperf_event *event){ // 1. 先禁用計(jì)數(shù)器確保配置安全  armv8pmu_disable_event_counter(event);  // 2. 配置事件類型  armv8pmu_write_event_type(event);  // 3. 使能中斷  armv8pmu_enable_event_irq(event);  // 4. 啟用計(jì)數(shù)器  armv8pmu_enable_event_counter(event);}

3.計(jì)數(shù)器讀寫機(jī)制

根據(jù)計(jì)數(shù)器類型(周期計(jì)數(shù)器/普通事件計(jì)數(shù)器)提供不同讀寫實(shí)現(xiàn):

// 讀取計(jì)數(shù)器值staticu64armv8pmu_read_counter(structperf_event *event){ structhw_perf_event *hwc = &event->hw; intidx = hwc->idx;  u64value; // 周期計(jì)數(shù)器特殊處理 if(idx == ARMV8_IDX_CYCLE_COUNTER)   value= read_sysreg(pmccntr_el0); else   value= armv8pmu_read_hw_counter(event); returnarmv8pmu_unbias_long_counter(event,value);}// 64位事件的鏈?zhǔn)接?jì)數(shù)器讀取staticu64armv8pmu_read_hw_counter(structperf_event *event){ intidx =event->hw.idx;  u64 val = armv8pmu_read_evcntr(idx); // 鏈?zhǔn)绞录枰喜蓚€(gè)32位計(jì)數(shù)器 if(armv8pmu_event_is_chained(event))    val = (val <32) | armv8pmu_read_evcntr(idx -1); returnval;}

4.調(diào)用鏈追蹤實(shí)現(xiàn)

調(diào)用鏈追蹤通過解析棧幀結(jié)構(gòu)實(shí)現(xiàn)函數(shù)調(diào)用路徑的記錄:

內(nèi)核態(tài)調(diào)用鏈

voidperf_callchain_kernel(structperf_callchain_entry_ctx *entry,            structpt_regs *regs) { if(perf_guest_state())return; // 暫不支持客戶機(jī)OS  // 遍歷內(nèi)核棧獲取調(diào)用鏈  arch_stack_walk(callchain_trace, entry, current, regs);}

用戶態(tài)調(diào)用鏈

區(qū)分AArch32/AArch64模式處理:

voidperf_callchain_user(structperf_callchain_entry_ctx *entry,           structpt_regs *regs) { perf_callchain_store(entry, regs->pc); // 存儲(chǔ)當(dāng)前PC if(!compat_user_mode(regs)) {   // AArch64模式棧幀解析   structframe_tail__user *tail = (structframe_tail __user *)regs->regs[29];   while(entry->nr < entry->max_stack && tail && !((unsignedlong)tail &0x7))      tail =user_backtrace(tail, entry);  }else{   // AArch32兼容模式棧幀解析#ifdefCONFIG_COMPAT   structcompat_frame_tail __user *tail =      (structcompat_frame_tail __user *)regs->compat_fp -1;   while((entry->nr < entry->max_stack) && tail && !((unsignedlong)tail &0x3))      tail =compat_user_backtrace(tail, entry);#endif  }}

三、核心調(diào)用流程

1. PMU初始化流程

wKgZO2kah4GANVTlAAK6Orm84Ws125.png

2.性能事件處理流程

wKgZO2kah4GABhr2AAGxwVl4Au4281.png

四、模塊關(guān)系腦圖

wKgZO2kah4GAWTZXAAKTVykxZUg717.png

五、開發(fā)者關(guān)注該模塊的核心意義

1.掌握底層性能監(jiān)控原理,突破工具使用局限

perf工具是開發(fā)者分析性能問題的常用工具,但默認(rèn)功能可能無法滿足定制化需求。例如:

?當(dāng)需要監(jiān)控ARM處理器特有的硬件事件(如L2緩存缺失率、分支預(yù)測(cè)失敗數(shù))時(shí),需理解perf_event.c中事件映射邏輯(__armv8_pmuv3_map_event),才能自定義事件編碼

?面對(duì)32位與64位應(yīng)用混合部署的場(chǎng)景,需通過perf_regs.c的寄存器適配邏輯,確保采樣數(shù)據(jù)在不同模式下的準(zhǔn)確性

?若需擴(kuò)展perf工具功能(如增加自定義調(diào)用鏈過濾規(guī)則),需深入perf_callchain.c的棧幀解析機(jī)制,避免破壞原有回溯邏輯

2.解決跨處理器架構(gòu)的兼容性問題

ARMv8架構(gòu)下處理器型號(hào)多樣(Cortex-A53/A72、Neoverse-N1等),不同處理器的PMU硬件特性存在差異:

?部分處理器支持64位事件計(jì)數(shù)(需鏈?zhǔn)胶喜蓚€(gè)32位計(jì)數(shù)器),部分僅支持32位計(jì)數(shù),理解armv8pmu_read_hw_counter的鏈?zhǔn)教幚磉壿?,可避免在不同處理器上出現(xiàn)計(jì)數(shù)溢出或數(shù)據(jù)錯(cuò)誤

?新處理器可能新增硬件事件(如NeoverseDDR帶寬監(jiān)控事件),開發(fā)者需基于armv8_pmu_init框架擴(kuò)展初始化函數(shù),實(shí)現(xiàn)新事件的支持,確保軟件在新硬件上的兼容性

3.優(yōu)化內(nèi)核驅(qū)動(dòng)與高性能應(yīng)用

對(duì)于內(nèi)核驅(qū)動(dòng)開發(fā)者或高性能應(yīng)用(如數(shù)據(jù)庫、實(shí)時(shí)控制系統(tǒng))開發(fā)者:

?可通過perf_event.c的計(jì)數(shù)器讀寫接口,在驅(qū)動(dòng)中集成自定義性能監(jiān)控邏輯,實(shí)時(shí)跟蹤驅(qū)動(dòng)關(guān)鍵路徑的執(zhí)行耗時(shí)

?結(jié)合perf_callchain.c的調(diào)用鏈追蹤,定位應(yīng)用中頻繁調(diào)用的內(nèi)核函數(shù),優(yōu)化系統(tǒng)調(diào)用或內(nèi)核態(tài)操作,減少上下文切換開銷

六、該模塊對(duì)調(diào)試的實(shí)際幫助

1.定位性能瓶頸:從現(xiàn)象根源的突破

傳統(tǒng)調(diào)試工具(如printf、log)僅能記錄代碼執(zhí)行流程,無法量化性能問題,而perf_event模塊提供的能力可精準(zhǔn)定位瓶頸:

?案例1:應(yīng)用CPU使用率過高

通過perf_event.c的周期計(jì)數(shù)器(pmccntr_el0),統(tǒng)計(jì)不同函數(shù)的CPU周期消耗;結(jié)合perf_callchain_user的調(diào)用鏈,發(fā)現(xiàn)某排序函數(shù)被頻繁調(diào)用,且每次調(diào)用觸發(fā)多次L1緩存缺失(通過PMU的緩存事件計(jì)數(shù)),最終定位到排序算法的時(shí)間復(fù)雜度問題,優(yōu)化后CPU使用率下降 。

?案例2:內(nèi)核驅(qū)動(dòng)響應(yīng)延遲

利用perf_callchain_kernel記錄驅(qū)動(dòng)函數(shù)的調(diào)用鏈,結(jié)合armv8pmu_handle_irq的中斷處理邏輯,發(fā)現(xiàn)驅(qū)動(dòng)中斷處理函數(shù)中存在自旋鎖爭用,導(dǎo)致中斷響應(yīng)延遲。通過調(diào)整鎖策略(如改用互斥鎖、減少鎖持有時(shí)間),將中斷延遲降低。

2.解決疑難雜癥:捕捉偶發(fā)的硬件相關(guān)問題

部分偶發(fā)問題(如寄存器值異常、硬件事件溢出)難以通過常規(guī)調(diào)試復(fù)現(xiàn),該模塊可提供關(guān)鍵線索:

?案例:32位應(yīng)用崩潰且日志無明確錯(cuò)誤

分析perf_regs.c的寄存器采樣數(shù)據(jù),發(fā)現(xiàn)崩潰時(shí)程序計(jì)數(shù)器(PC)指向無效地址,且棧指針(SP)未按32位模式對(duì)齊(未滿足4字節(jié)對(duì)齊要求)。進(jìn)一步查看compat_user_backtrace的棧幀解析邏輯,發(fā)現(xiàn)應(yīng)用在調(diào)用匯編函數(shù)時(shí)未正確保存SP,導(dǎo)致棧幀錯(cuò)亂,修復(fù)棧對(duì)齊問題后崩潰消失。

?案例:PMU計(jì)數(shù)器數(shù)據(jù)異常

調(diào)試時(shí)發(fā)現(xiàn)某硬件事件計(jì)數(shù)為0,排查__armv8_pmuv3_map_event的事件映射邏輯,發(fā)現(xiàn)該事件ID未在armv8pmu_probe_pmu探測(cè)的pmceid_bitmap中置位,說明當(dāng)前處理器不支持該事件,避免開發(fā)者在不支持的硬件上浪費(fèi)調(diào)試時(shí)間。

3.驗(yàn)證優(yōu)化效果:量化調(diào)試成果

調(diào)試后的優(yōu)化效果需量化驗(yàn)證,該模塊提供客觀的評(píng)估依據(jù):

?優(yōu)化前后,通過armv8pmu_read_counter讀取同一事件的計(jì)數(shù)(如CPU周期、緩存缺失數(shù)),對(duì)比優(yōu)化效果

?結(jié)合調(diào)用鏈追蹤,統(tǒng)計(jì)優(yōu)化后關(guān)鍵函數(shù)的調(diào)用次數(shù)變化,驗(yàn)證優(yōu)化是否減少了冗余調(diào)用

?對(duì)于實(shí)時(shí)系統(tǒng),通過中斷計(jì)數(shù)器(armv8pmu_enable_event_irq),驗(yàn)證優(yōu)化后中斷響應(yīng)時(shí)間是否滿足實(shí)時(shí)性要求

七、總結(jié)

ARM架構(gòu)下的perf_event相關(guān)模塊不僅是perf工具的底層支撐,更是開發(fā)者理解硬件特性、優(yōu)化軟件性能、解決疑難調(diào)試問題的核心工具。其分層設(shè)計(jì)(硬件適配層、事件管理層、數(shù)據(jù)采集層)既保證了對(duì)不同ARM處理器的兼容性,又為定制化擴(kuò)展提供了靈活接口。

對(duì)于開發(fā)者而言,深入掌握該模塊:

?可突破工具使用局限,實(shí)現(xiàn)定制化性能監(jiān)控

?能快速定位性能瓶頸與疑難問題,提升調(diào)試效率

?為內(nèi)核驅(qū)動(dòng)與高性能應(yīng)用的優(yōu)化提供底層依據(jù)

無論是日常的應(yīng)用開發(fā)調(diào)試,還是底層的硬件軟件適配,該模塊的知識(shí)都能為開發(fā)者提供關(guān)鍵支撐,是ARM架構(gòu)下Linux系統(tǒng)開發(fā)與調(diào)試的重要基礎(chǔ)。

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

    關(guān)注

    135

    文章

    9552

    瀏覽量

    391804
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5608

    瀏覽量

    129946
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    一文詳解Linux的perf_event

    Linux性能子系統(tǒng)在性能分析中非常有用。以下顯示了這篇文章中的perf子系統(tǒng)componenet 。
    發(fā)表于 10-11 09:04 ?2620次閱讀

    labview設(shè)計(jì)模式深入解析-天津大學(xué)精儀學(xué)院

      什么是設(shè)計(jì)模式?  ?一種LabVIEW程序模板與架構(gòu)  軟件實(shí)踐中通用的程序架構(gòu),其本質(zhì)是對(duì)很多十分類似的問題進(jìn)行總結(jié)歸納的基礎(chǔ)上提煉出的一些具有代表性的軟件開發(fā)規(guī)范  ?具有靈活的配置功能  ?被廣泛
    發(fā)表于 12-28 16:10

    功能安全---AUTOSAR架構(gòu)深度解析 精選資料分享

    AUTOSAR架構(gòu)深度解析本文轉(zhuǎn)載于:AUTOSAR架構(gòu)深度解析AUTOSAR的分層式設(shè)計(jì),用于支持完整的軟件和硬件模塊的獨(dú)立性(Indep
    發(fā)表于 07-23 08:34

    perf分析程序的熱點(diǎn)函數(shù)解析,錯(cuò)過絕對(duì)后悔

    perf分析程序的熱點(diǎn)函數(shù)解析,錯(cuò)過絕對(duì)后悔
    發(fā)表于 12-23 06:41

    全志Tina中使用perf分析CPU使用率

    基礎(chǔ),支持針對(duì)處理器相關(guān)性能指標(biāo)與操作系統(tǒng)相關(guān)性能指標(biāo)的性能剖析。常用于性能瓶頸的查找與熱點(diǎn)代碼的定位。Tina上開啟perf功能刪除out目錄,開啟如下Tina與內(nèi)核的
    發(fā)表于 05-20 14:25

    深入介紹Arm架構(gòu)的R-Profile

    本指南向您介紹Arm架構(gòu)的R-Profile。您將了解Arm架構(gòu)、R-Profile的演變以及所有R-Profile版本中的功能。 本指南不
    發(fā)表于 08-02 17:51

    ARM的發(fā)展史以及架構(gòu)解析

    本文從ARM的發(fā)展歷史著手,以S3C2440為例與51單片機(jī)進(jìn)行對(duì)比分析,詳細(xì)解析ARM架構(gòu)。
    發(fā)表于 04-22 11:00 ?1.6w次閱讀

    深入解析ARM Cortex-A12架構(gòu)

    深入解析ARM Cortex-A12架構(gòu)
    發(fā)表于 01-14 12:31 ?21次下載

    ARM新銳Cortex_A7核心架構(gòu)解析

    ARM新銳Cortex_A7核心架構(gòu)解析
    發(fā)表于 09-28 10:10 ?11次下載
    <b class='flag-5'>ARM</b>新銳Cortex_A7核心<b class='flag-5'>架構(gòu)</b><b class='flag-5'>解析</b>

    利用tracepoint梳理調(diào)度器框架及主要流程

    靜態(tài)tracepoint預(yù)埋在內(nèi)核的關(guān)鍵位置, 通過這些預(yù)埋的tracepoint, 可以比較容易梳理出相關(guān)模塊的框架及主要流程. 相比于直接鉆到scheduler的實(shí)現(xiàn)細(xì)節(jié)中去, 我們先通過
    的頭像 發(fā)表于 10-30 14:36 ?2846次閱讀

    解構(gòu)內(nèi)核 perf 框架的實(shí)現(xiàn)講解

    perf 框架,前端承接用戶態(tài)的各種事件(event)的屬性配置,后端將 event 嫁接到內(nèi)核的調(diào)度、文件系統(tǒng)等框架中,底層對(duì)接各種 PMU 硬件,所以其必然要建立一個(gè)復(fù)雜、嚴(yán)謹(jǐn)?shù)哪P停ǔ橄螅┫到y(tǒng)。
    發(fā)表于 01-16 09:49 ?1940次閱讀

    framework框架流程 模塊綁定

    framework框架負(fù)責(zé)固件的通用流程實(shí)現(xiàn),包括系統(tǒng)初始化,module初始化,中斷服務(wù)提供,event服務(wù)提供等。這樣module就可以專注于自己功能和對(duì)外交互api的實(shí)現(xiàn)。SCP
    的頭像 發(fā)表于 11-02 17:24 ?1521次閱讀
    framework框架<b class='flag-5'>流程</b> <b class='flag-5'>模塊</b>綁定

    如何使用perf性能分析工具

    功能上,perf很強(qiáng)大,可以對(duì)眾多的軟硬件事件采樣,還能采集出跟蹤點(diǎn)(trace points)的信息(比如系統(tǒng)調(diào)用、TCP/IP事件和文件系統(tǒng)操作。perf的代碼和Linux內(nèi)核代
    的頭像 發(fā)表于 11-08 15:36 ?2818次閱讀
    如何使用<b class='flag-5'>perf</b>性能分析工具

    Linux perf 簡要介紹

    一、引言 (Introduction) 簡要介紹Linux perf (Brief Introduction to Linux perf) Linux perf(性能分析工具)是一個(gè)功能
    的頭像 發(fā)表于 11-09 17:06 ?1727次閱讀

    深入解析LMZ31707:7A電源模塊的卓越性能與應(yīng)用指南

    深入解析LMZ31707:7A電源模塊的卓越性能與應(yīng)用指南 在電子設(shè)計(jì)領(lǐng)域,電源模塊的性能直接影響著整個(gè)系統(tǒng)的穩(wěn)定性和效率。今天,我們將
    的頭像 發(fā)表于 03-04 11:55 ?178次閱讀