日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

(信息量有點大)基于RK3576深入解讀kernel-6.1/System.map:內(nèi)核開發(fā)調(diào)試的“地址-功能”導(dǎo)航圖

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

掃碼添加小助手

加入工程師交流群

Linux內(nèi)核開發(fā)與調(diào)試場景中,你是否遇到過這些困惑?內(nèi)核panic時打印的pc: ffffffc00801c400究竟對應(yīng)哪個函數(shù)?編寫模塊時引用的foo符號為何提示未定義?優(yōu)化內(nèi)核時如何判斷某個功能是否被編譯進去?

答案都藏在kernel-6.1/System.map——它不是內(nèi)核代碼,卻是連接機器地址人類可讀功能的核心橋梁,是kernel開發(fā)者調(diào)試字典開發(fā)指南針。

本文將從以下5個維度,帶你吃透kernel-6.1 System.map的價值,讓內(nèi)核開發(fā)調(diào)試效率翻倍:

1.本質(zhì)定位:System.map是什么?kernel-6.1中的結(jié)構(gòu)如何解讀?

2.核心知識點:符號類型、地址空間、內(nèi)核段關(guān)聯(lián)的底層邏輯(附kernel-6.1實例)

3.調(diào)試實戰(zhàn):查看該文件能解決哪些痛點?(Oops定位、?;厮莸劝咐?/span>

4.開發(fā)意義:對模塊編寫、內(nèi)核裁剪、版本兼容的實際幫助

5.流程可視化:用流程圖梳理實戰(zhàn)場景(崩潰調(diào)試、模塊開發(fā))

一、System.map本質(zhì):kernel-6.1地址-符號映射字典

kernel-6.1/System.map是內(nèi)核編譯過程中由鏈接器ld生成的符號表文件,核心作用是將內(nèi)核運行時的虛擬地址可讀符號(函數(shù)/變量)建立映射。

它就像內(nèi)核的身份證系統(tǒng)”——每個符號(如函數(shù)die、變量jiffies_64)都有唯一的地址身份證,開發(fā)者通過地址查符號,就能快速定位功能歸屬。

1.1生成路徑與核心作用

?默認路徑kernel-6.1編譯后,默認存放在kernel-6.1/System.map

?核心價值

?破解地址黑盒:將Oops/panic打印的虛擬地址(如ffffffc00801c400)翻譯成可讀符號(如die);

?驗證符號有效性:判斷模塊引用的符號是否存在、是否可導(dǎo)出(如T類型符號可被外部調(diào)用);

?反推內(nèi)核配置:通過符號是否存在,判斷功能是否編譯(如smp_send_reschedule存在開啟SMP)。

1.2 kernel-6.1符號結(jié)構(gòu)解析(一行看懂)

System.map的每一行都遵循固定格式,以kernel-6.1ffffffc00801c400 T die為例,拆解3個關(guān)鍵字段:

字段

示例值

說明(結(jié)合kernel-6.1

虛擬地址

ffffffc00801c400

符號在內(nèi)存中的虛擬地址(ARM64內(nèi)核地址多以ffffffc0開頭,用戶空間地址以00000000開頭)

符號類型

T

區(qū)分符號屬性:大寫為全局符號(可被外部模塊引用),小寫為局部符號(僅內(nèi)核內(nèi)部使用)

符號名

die

可讀符號名(diekernel-6.1中內(nèi)核崩潰的核心處理函數(shù),定義在kernel/exit.c

1.3 kernel-6.1常見符號類型對照表

符號類型直接反映符號的歸屬段(代碼段/數(shù)據(jù)段)和可見性,kernel-6.1中高頻出現(xiàn)的類型如下:

符號類型

含義

kernel-6.1實例

對應(yīng)內(nèi)核段

T

全局代碼段符號(可導(dǎo)出)

T _text(內(nèi)核代碼段起始地址)

.text(代碼段)

t

局部代碼段符號(僅內(nèi)部使用)

t __bad_stack(異常棧處理函數(shù))

.text(代碼段)

A

絕對符號(地址編譯時固定)

A PECOFF_FILE_ALIGNMENTPECOFF對齊值)

絕對段

W

弱符號(可被重定義)

W calibrate_delay_is_known(延遲校準標志)

.data(數(shù)據(jù)段)

B

全局數(shù)據(jù)段符號(已初始化)

B jiffies_64(系統(tǒng)滴答計數(shù)器)

.data(數(shù)據(jù)段)

二、必須掌握的4個核心知識點(結(jié)合kernel-6.1

看懂System.map不只是查地址,更要通過符號反推kernel-6.1內(nèi)存布局、功能模塊、配置狀態(tài)——這才是它的深層價值。

2.1符號類型內(nèi)核段歸屬:快速定位功能區(qū)域

kernel-6.1的內(nèi)存被劃分為多個功能段,符號類型+地址范圍可直接判斷歸屬,幫你快速定位功能場景:

?代碼段(.textT/t類型符號的聚集地,存放內(nèi)核所有執(zhí)行函數(shù),例如:

?T _textffffffc008000000):kernel-6.1代碼段起始地址,內(nèi)核啟動后第一個執(zhí)行的代碼段;

?T __irqentry_text_start~T __irqentry_text_end:中斷入口代碼段,包含gic_handle_irqARM64 GIC中斷處理函數(shù));

?T vectorsffffffc008010800):ARM64異常向量表,是內(nèi)核處理中斷、系統(tǒng)調(diào)用、異常的入口網(wǎng)關(guān)

wKgZO2kamRaAV4NhAACyZI2JQ5Q148.png

?數(shù)據(jù)段(.dataW/B類型符號所在,存放已初始化的全局變量,例如:

?W calibration_delay_done:延遲校準完成標志,內(nèi)核啟動時用于判斷是否跳過校準流程;

?B jiffies_64:系統(tǒng)滴答計數(shù)器,記錄內(nèi)核運行時間,是定時器、調(diào)度的核心變量。

?絕對段A類型符號,地址編譯時固定,不隨內(nèi)存布局變化,例如A _kernel_size_le_lo32kernel-6.1內(nèi)核大小低32位)。

2.2 ARM64地址空間符號的居住區(qū)域

kernel-6.1ARM64架構(gòu))的符號地址主要分兩類,對應(yīng)Linux內(nèi)核的地址空間隔離設(shè)計:

1.內(nèi)核虛擬地址(ffffffc0開頭)

?示例:ffffffc00801c400 T die(崩潰處理)、ffffffc008010628 T __entry_text_start(系統(tǒng)調(diào)用入口段起始);

?特點:與用戶空間地址(00000000~ffff0000)完全隔離,保障內(nèi)核安全性,僅內(nèi)核態(tài)可訪問。

1.早期/特定段地址(00000000開頭)

?示例:00000000 A _kernel_flags_le_hi32(內(nèi)核標志高32位)、00000000 A __pecoff_data_rawsizePECOFF數(shù)據(jù)原始大?。?;

?特點:地址編譯時固定,多用于內(nèi)核早期啟動(如EFI stub初始化)或文件格式相關(guān)(PECOFFWindows可執(zhí)行文件格式,內(nèi)核用于兼容引導(dǎo))。

2.3符號名內(nèi)核子系統(tǒng)映射:一眼識別功能

kernel-6.1的符號名遵循功能前綴規(guī)則,通過符號名可直接對應(yīng)內(nèi)核子系統(tǒng),減少查源碼的時間:

內(nèi)核子系統(tǒng)

符號名前綴/關(guān)鍵詞

kernel-6.1實例

功能說明

中斷處理

gic_irq_、do_undef

t gic_handle_irq、T do_undefinstr

GIC中斷處理、未定義指令異常處理

進程調(diào)度

sched_cpu_switch

T cpu_switch_to、t pick_next_task_fair

進程切換、CFS調(diào)度器選任務(wù)

內(nèi)存管理

pgd_、do_page_fault

T pgd_alloc、t do_page_fault

頁表分配、頁錯誤處理

系統(tǒng)調(diào)用

__arm64_sys_

T __arm64_sys_mmap、T __arm64_sys_exit

ARM64架構(gòu)的mmap/exit系統(tǒng)調(diào)用

EFI引導(dǎo)

__efistub_efi_

A __efistub_primary_entry_offset

EFI stub啟動入口偏移量

2.4符號存在性內(nèi)核配置判斷

kernel-6.1中某個符號是否存在,直接反映內(nèi)核編譯時的配置(.config):

?若存在T smp_send_reschedule開啟CONFIG_SMP(對稱多處理器);

?若存在T __arm64_sys_fanotify_init開啟CONFIG_FANOTIFY(文件系統(tǒng)事件通知);

?若不存在t has_no_fpsimd開啟CONFIG_FPSIMDARM64浮點/向量支持)。

這對內(nèi)核裁剪優(yōu)化非常有用:若不需要SMP功能,編譯時關(guān)閉CONFIG_SMP,smp_send_reschedule等符號會消失,減少內(nèi)核體積。

三、調(diào)試時關(guān)注System.map:解決4大核心痛點

kernel-6.1調(diào)試中,System.map效率工具”——沒有它,你可能需要花幾小時猜地址;有了它,幾分鐘就能定位問題。

3.1 Oops崩潰定位:從地址到函數(shù)的一秒翻譯

內(nèi)核Oops是最常見的調(diào)試場景,例如打?。?/span>

Oops:0000000000000005[#1] PREEMPT SMPPCisat ffffffc00801c400

此時查System.map即可快速定位:

1.打開kernel-6.1/System.map,搜索ffffffc00801c400;

2.找到對應(yīng)行:ffffffc00801c400 T die確認崩潰發(fā)生在die函數(shù);

3.查看die源碼(kernel/exit.c),結(jié)合Oops上下文(如寄存器值、調(diào)用鏈),判斷是空指針訪問還是非法內(nèi)存地址。

wKgZO2kamRaARWZwAAAGXTTy754087.png

流程圖

wKgZO2kamRaAVFHBAACEPmNZadc777.jpg


3.2內(nèi)核恐慌棧回溯:補全函數(shù)調(diào)用鏈

當(dāng)內(nèi)核panic打印?;厮荩?/span>Backtrace)時,會輸出一串函數(shù)地址,例如:

Backtrace:ffffffc00801c400 → ffffffc00801c680 → ffffffc00801d8e0

通過System.map翻譯地址:

?ffffffc00801c400 → die(崩潰處理);

?ffffffc00801c680 → arm64_force_sig_fault(強制發(fā)送信號);

?ffffffc00801d8e0 → do_serror(系統(tǒng)錯誤處理)。

瞬間補全調(diào)用鏈:do_serrorarm64_force_sig_faultdie,快速定位錯誤傳播路徑。

wKgZO2kamRaAcEztAAAqGb7Xe_E678.png

3.3模塊開發(fā)符號驗證:避免未定義引用

編寫kernel-6.1內(nèi)核模塊時,若引用foo函數(shù)卻提示“undefined reference tofoo,可通過System.map排查:

1.搜索foo符號:

?若不存在內(nèi)核未編譯foo對應(yīng)的功能,需開啟相關(guān)配置(如CONFIG_FOO=y);

?若存在但類型為tfoo是局部符號(僅內(nèi)核內(nèi)部使用),無法被模塊引用,需修改內(nèi)核源碼將foo導(dǎo)出(添加EXPORT_SYMBOL(foo));

?若存在且類型為Tfoo是全局符號,模塊中聲明extern int foo();即可正常編譯。

3.4性能分析地址翻譯:perf采樣結(jié)果落地

perf record -g采樣內(nèi)核性能時,結(jié)果會包含大量地址,例如:

Samples:100 of event 'cycles', Event count (approx.):123456ffffffc0080164a420%ffffffc0080165d015%

通過System.map翻譯:

?ffffffc0080164a4 T cpu_switch_to(進程切換);

?ffffffc0080165d0 T fpsimd_thread_switch(浮點上下文切換)。

wKgZO2kamRaAP-v3AAAcv-M-hzQ565.png

可快速判斷性能瓶頸在進程切換,進而優(yōu)化調(diào)度策略。

四、對開發(fā)的意義:從試錯精準

kernel-6.1/System.map不只是調(diào)試工具,更是kernel開發(fā)的正確性保障效率加速器。

4.1提升內(nèi)核調(diào)試效率

沒有System.map時,調(diào)試需通過addr2line工具(需帶調(diào)試信息的內(nèi)核鏡像vmlinux),且依賴內(nèi)核編譯時保留調(diào)試符號;有了System.map,直接查地址符號,無需額外工具,尤其適合無調(diào)試信息的release版本內(nèi)核。

4.2保障模塊開發(fā)正確性

kernel-6.1模塊開發(fā)中,符號引用錯誤是常見問題(如引用不存在的符號、引用局部符號)。System.map可提前驗證符號有效性,避免模塊加載時因符號未定義被內(nèi)核拒絕(insmod: ERROR: could not insert module xxx.ko: Unknown symbol in module)。

模塊開發(fā)流程圖

wKgZO2kamReADQXGAACng1Nxtrc619.png

4.3輔助內(nèi)核裁剪與優(yōu)化

kernel-6.1支持按需裁剪功能,System.map可驗證裁剪效果:

?若不需要EFI引導(dǎo),關(guān)閉CONFIG_EFI后,__efistub_前綴的符號會消失,說明裁剪成功;

?若不需要浮點支持,關(guān)閉CONFIG_FPSIMD后,fpsimd_前綴的符號會消失,減少內(nèi)核體積。

4.4驗證版本兼容性

不同內(nèi)核版本(如kernel-6.1kernel-6.2)的符號地址可能變化,若模塊硬編碼地址,會導(dǎo)致加載失敗。通過對比System.map

?foo符號在kernel-6.1中地址為ffffffc0080164a4,在kernel-6.2中為ffffffc008016500,說明地址偏移,需修改模塊為符號引用而非地址硬編碼。

五、總結(jié):System.mapkernel-6.1開發(fā)的基礎(chǔ)設(shè)施

kernel-6.1/System.map看似是簡單的地址-符號列表,實則是內(nèi)核的功能導(dǎo)航圖”——它連接了機器可識別的地址與人類可理解的功能,解決了調(diào)試中的地址黑盒問題,保障了開發(fā)中的符號正確性。

無論是內(nèi)核崩潰定位、模塊開發(fā),還是性能優(yōu)化、版本兼容,System.map都能幫你從盲目試錯轉(zhuǎn)向精準操作,是 linux開發(fā)者必須掌握的核心工具。

下次遇到內(nèi)核問題時,先打開System.map——它或許能幫你省下幾小時的調(diào)試時間。

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

    關(guān)注

    4

    文章

    1476

    瀏覽量

    43098
  • 開發(fā)調(diào)試
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    基于RK3576開發(fā)板的PWN使用說明

    RK3576開發(fā)板使用PWN教程及Demo
    的頭像 發(fā)表于 05-07 14:07 ?2525次閱讀
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>開發(fā)</b>板的PWN使用說明

    基于RK3576開發(fā)板的RTC使用說明

    文章主要展示RK3576開發(fā)板的RTC信息和快速上手例程
    的頭像 發(fā)表于 05-07 15:04 ?2643次閱讀
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>開發(fā)</b>板的RTC使用說明

    如何移植EtherCAT Igh--基于米爾RK3576開發(fā)

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微RK3576開發(fā)板)的板端移植EtherCATIgh方案的開發(fā)測試。摘自優(yōu)秀
    的頭像 發(fā)表于 09-26 08:04 ?1w次閱讀
    如何移植EtherCAT Igh--基于米爾<b class='flag-5'>RK3576</b><b class='flag-5'>開發(fā)</b>板

    RK3576 Android 14.0 SDK開發(fā)指南(第一集)

    kernel,kernel源碼在工程中kernel-6.1目錄下 Lunch項說明 一鍵編譯命令 ./build.sh -UKAupSoc RK3576 SDK默認沒有開啟GK
    發(fā)表于 05-20 08:43

    RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?

    瑞芯微(Rockchip)最新發(fā)布的 RK3576 一經(jīng)推出,就吸引了大量原本關(guān)注 RK3588 的開發(fā)者。RK3588 作為旗艦級芯片,性能固然強大,但
    發(fā)表于 05-30 08:46

    【米爾RK3576開發(fā)板免費體驗】3、移植EtherCAT Igh

    6.1.75,將文件夾中的Kernel-6.1下的補丁應(yīng)用到內(nèi)核配置中。 cd /path/to/kernel-6.1/ patch中存在重定義問題 serial8250_set_IER
    發(fā)表于 07-21 10:35

    【作品合集】米爾RK3576開發(fā)板測評

    米爾RK3576開發(fā)板測評作品合集 產(chǎn)品介紹: RK3576 是瑞芯微一款面向AI市場推出的高性能處理器,它配備了四核Cortex-A72和四 核Cortex-A53 的 CPU,集成了6TOPS
    發(fā)表于 09-11 10:19

    【作品合集】靈眸科技EASY EAI Orin Nano(RK3576開發(fā)板測評

    6Tops,支持INT4/INT8/INT16/FP16混合運算。提供完整的Linux開發(fā)包供客戶二次開發(fā)。 活動詳情地址:【RISC-V專題】EASY EAI Orin Nano(RK357
    發(fā)表于 09-09 09:59

    如何米爾RK3576開發(fā)板上移植EtherCAT Igh

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微 RK3576開發(fā)板)的板端移植EtherCAT Igh方案的開發(fā)測試。摘自
    發(fā)表于 09-26 16:02

    新品體驗 | RK3576開發(fā)

    前言:RK3576作為瑞芯微第二代8nm高性能AIOT平臺,一經(jīng)推出便獲得了極大的關(guān)注。廣州眺望電子科技有限公司是一家專注于嵌入式處理器模組研發(fā)與應(yīng)用的國家高新技術(shù)企業(yè),目前公司已推出的相關(guān)型號有
    的頭像 發(fā)表于 11-01 08:08 ?3436次閱讀
    新品體驗 | <b class='flag-5'>RK3576</b><b class='flag-5'>開發(fā)</b>板

    RK3576單板發(fā)布倒計時:RK3399與RK3576對比

    好多人說RK3576RK3399的升級版,某種程度上也可以這么說,RK3576在強大的多媒體功能的基礎(chǔ)上,性能和接口都進行了升級 一、工藝 性能
    的頭像 發(fā)表于 12-03 16:59 ?2799次閱讀
    <b class='flag-5'>RK3576</b>單板發(fā)布倒計時:<b class='flag-5'>RK</b>3399與<b class='flag-5'>RK3576</b>對比

    初次編譯rk3568(rk3576)Linux 6.1內(nèi)核踩坑記錄:從報錯終止到成功解決的完整流程

    很多剛接觸瑞芯微 rk 系列芯片開發(fā)的小伙伴,在初次編譯基于 Linux 6.1 內(nèi)核的系統(tǒng)時,很容易因為環(huán)境依賴問題卡殼。最近我在編譯 rk357
    的頭像 發(fā)表于 02-06 16:47 ?3266次閱讀
    初次編譯<b class='flag-5'>rk</b>3568(<b class='flag-5'>rk3576</b>)Linux <b class='flag-5'>6.1</b><b class='flag-5'>內(nèi)核</b>踩坑記錄:從報錯終止到成功解決的完整流程

    RK3576音頻調(diào)試全紀錄

    在嵌入式設(shè)備開發(fā)中,音頻調(diào)試往往是“牽一發(fā)而動全身” 的環(huán)節(jié) —— 既需要對齊硬件原理圖的信號定義,又要適配軟件層的 codec 配置、引腳映射和驅(qū)動邏輯。本文基于 RK3576 平臺的實際調(diào)
    的頭像 發(fā)表于 02-02 17:13 ?1855次閱讀
    <b class='flag-5'>RK3576</b>音頻<b class='flag-5'>調(diào)試</b>全紀錄

    迅為如何在RK3576上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)

    迅為如何在RK3576開發(fā)板上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)
    的頭像 發(fā)表于 11-25 14:06 ?1996次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)

    迅為電子RK系列開發(fā)板SDK內(nèi)核正式升級至6.1 LTS版本

    迅為RK3568、RK3588、RK3576RK3562系列開發(fā)板,SDK內(nèi)核從5.10版本正
    的頭像 發(fā)表于 03-16 16:18 ?569次閱讀
    五寨县| 灵丘县| 湘阴县| 洛隆县| 平潭县| 荥经县| 和龙市| 榆中县| 鄂尔多斯市| 哈密市| 长乐市| 安乡县| 醴陵市| 灵川县| 雷山县| 河北省| 额敏县| 阿尔山市| 德庆县| 团风县| 建湖县| 红原县| 麦盖提县| 上虞市| 双桥区| 淳安县| 科技| 蒙城县| 清远市| 栾川县| 吴忠市| 专栏| 武山县| 南宫市| 华安县| 昌黎县| 钟山县| 镇赉县| 永靖县| 内黄县| 乌兰察布市|