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

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

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

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

(信息量有點(diǎn)大)基于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時(shí)打印的pc: ffffffc00801c400究竟對應(yīng)哪個(gè)函數(shù)?編寫模塊時(shí)引用的foo符號(hào)為何提示未定義?優(yōu)化內(nèi)核時(shí)如何判斷某個(gè)功能是否被編譯進(jìn)去?

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

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

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

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

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

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

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

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

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

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

1.1生成路徑與核心作用

?默認(rèn)路徑kernel-6.1編譯后,默認(rèn)存放在kernel-6.1/System.map

?核心價(jià)值

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

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

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

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

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

字段

示例值

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

虛擬地址

ffffffc00801c400

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

符號(hào)類型

T

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

符號(hào)名

die

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

1.3 kernel-6.1常見符號(hào)類型對照表

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

符號(hào)類型

含義

kernel-6.1實(shí)例

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

T

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

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

.text(代碼段)

t

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

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

.text(代碼段)

A

絕對符號(hào)(地址編譯時(shí)固定)

A PECOFF_FILE_ALIGNMENTPECOFF對齊值)

絕對段

W

弱符號(hào)(可被重定義)

W calibrate_delay_is_known(延遲校準(zhǔn)標(biāo)志)

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

B

全局?jǐn)?shù)據(jù)段符號(hào)(已初始化)

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

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

二、必須掌握的4個(gè)核心知識(shí)點(diǎn)(結(jié)合kernel-6.1

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

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

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

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

?T _textffffffc008000000):kernel-6.1代碼段起始地址,內(nèi)核啟動(dòng)后第一個(gè)執(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類型符號(hào)所在,存放已初始化的全局變量,例如:

?W calibration_delay_done:延遲校準(zhǔn)完成標(biāo)志,內(nèi)核啟動(dòng)時(shí)用于判斷是否跳過校準(zhǔn)流程;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

kernel-6.1實(shí)例

功能說明

中斷處理

gic_、irq_do_undef

t gic_handle_irq、T do_undefinstr

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

進(jìn)程調(diào)度

sched_cpu_switch

T cpu_switch_to、t pick_next_task_fair

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

內(nèi)存管理

pgd_、do_page_fault

T pgd_alloc、t do_page_fault

頁表分配、頁錯(cuò)誤處理

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

__arm64_sys_

T __arm64_sys_mmapT __arm64_sys_exit

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

EFI引導(dǎo)

__efistub_、efi_

A __efistub_primary_entry_offset

EFI stub啟動(dòng)入口偏移量

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

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

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

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

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

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

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

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

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

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

Oops:0000000000000005[#1] PREEMPT SMPPCisat ffffffc00801c400

此時(shí)查System.map即可快速定位:

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

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

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

wKgZO2kamRaARWZwAAAGXTTy754087.png

流程圖

wKgZO2kamRaAVFHBAACEPmNZadc777.jpg


3.2內(nèi)核恐慌?;厮荩貉a(bǔ)全函數(shù)調(diào)用鏈

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

Backtrace:ffffffc00801c400 → ffffffc00801c680 → ffffffc00801d8e0

通過System.map翻譯地址:

?ffffffc00801c400 → die(崩潰處理);

?ffffffc00801c680 → arm64_force_sig_fault(強(qiáng)制發(fā)送信號(hào));

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

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

wKgZO2kamRaAcEztAAAqGb7Xe_E678.png

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

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

1.搜索foo符號(hào):

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

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

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

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

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

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

通過System.map翻譯:

?ffffffc0080164a4 T cpu_switch_to(進(jìn)程切換);

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

wKgZO2kamRaAP-v3AAAcv-M-hzQ565.png

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

四、對開發(fā)的意義:從試錯(cuò)精準(zhǔn)

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

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

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

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

kernel-6.1模塊開發(fā)中,符號(hào)引用錯(cuò)誤是常見問題(如引用不存在的符號(hào)、引用局部符號(hào))。System.map可提前驗(yàn)證符號(hào)有效性,避免模塊加載時(shí)因符號(hào)未定義被內(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可驗(yàn)證裁剪效果:

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

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

4.4驗(yàn)證版本兼容性

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

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

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

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

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

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

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

    關(guān)注

    4

    文章

    1468

    瀏覽量

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

    關(guān)注

    0

    文章

    6

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

    基于RK3576開發(fā)板的人臉識(shí)別算法

    RK3576開發(fā)板展示人臉識(shí)別算法例程和API說明
    的頭像 發(fā)表于 05-07 16:48 ?2736次閱讀
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>開發(fā)</b>板的人臉識(shí)別算法

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

    本文將介紹基于米爾電子MYD-LR3576開發(fā)板(米爾基于瑞芯微RK3576開發(fā)板)的板端移植EtherCATIgh方案的開發(fā)測試。摘自優(yōu)秀
    的頭像 發(fā)表于 09-26 08:04 ?9892次閱讀
    如何移植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項(xiàng)說明 一鍵編譯命令 ./build.sh -UKAupSoc RK3576 SDK默認(rèn)沒有開啟GK
    發(fā)表于 05-20 08:43

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

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

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

    6.1.75,將文件夾中的Kernel-6.1下的補(bǔ)丁應(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混合運(yùn)算。提供完整的Linux開發(fā)包供客戶二次開發(fā)。 活動(dòng)詳情地址:【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

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

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

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

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

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

    很多剛接觸瑞芯微 rk 系列芯片開發(fā)的小伙伴,在初次編譯基于 Linux 6.1 內(nèi)核的系統(tǒng)時(shí),很容易因?yàn)榄h(huán)境依賴問題卡殼。最近我在編譯 rk357
    的頭像 發(fā)表于 02-06 16:47 ?2578次閱讀
    初次編譯<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>踩坑記錄:從報(bào)錯(cuò)終止到成功解決的完整流程

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

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

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

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