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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

(信息量有點大)基于RK3576深入解讀kernel-6.1/System.map:內核開發調試的“地址-功能”導航圖

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

掃碼添加小助手

加入工程師交流群

Linux內核開發與調試場景中,你是否遇到過這些困惑?內核panic時打印的pc: ffffffc00801c400究竟對應哪個函數?編寫模塊時引用的foo符號為何提示未定義?優化內核時如何判斷某個功能是否被編譯進去?

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

本文將從以下5個維度,帶你吃透kernel-6.1 System.map的價值,讓內核開發調試效率翻倍:

1.本質定位:System.map是什么?kernel-6.1中的結構如何解讀?

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

3.調試實戰:查看該文件能解決哪些痛點?(Oops定位、棧回溯等案例)

4.開發意義:對模塊編寫、內核裁剪、版本兼容的實際幫助

5.流程可視化:用流程圖梳理實戰場景(崩潰調試、模塊開發)

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

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

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

1.1生成路徑與核心作用

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

?核心價值

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

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

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

1.2 kernel-6.1符號結構解析(一行看懂)

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

字段

示例值

說明(結合kernel-6.1

虛擬地址

ffffffc00801c400

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

符號類型

T

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

符號名

die

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

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

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

符號類型

含義

kernel-6.1實例

對應內核段

T

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

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

.text(代碼段)

t

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

t __bad_stack(異常棧處理函數)

.text(代碼段)

A

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

A PECOFF_FILE_ALIGNMENTPECOFF對齊值)

絕對段

W

弱符號(可被重定義)

W calibrate_delay_is_known(延遲校準標志)

.data(數據段)

B

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

B jiffies_64(系統滴答計數器)

.data(數據段)

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

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

2.1符號類型內核段歸屬:快速定位功能區域

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

?代碼段(.textT/t類型符號的聚集地,存放內核所有執行函數,例如:

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

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

?T vectorsffffffc008010800):ARM64異常向量表,是內核處理中斷、系統調用、異常的入口網關

wKgZO2kamRaAV4NhAACyZI2JQ5Q148.png

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

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

?B jiffies_64:系統滴答計數器,記錄內核運行時間,是定時器、調度的核心變量。

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

2.2 ARM64地址空間符號的居住區域

kernel-6.1ARM64架構)的符號地址主要分兩類,對應Linux內核的地址空間隔離設計:

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

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

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

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

?示例:00000000 A _kernel_flags_le_hi32(內核標志高32位)、00000000 A __pecoff_data_rawsizePECOFF數據原始大小);

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

2.3符號名內核子系統映射:一眼識別功能

kernel-6.1的符號名遵循功能前綴規則,通過符號名可直接對應內核子系統,減少查源碼的時間:

內核子系統

符號名前綴/關鍵詞

kernel-6.1實例

功能說明

中斷處理

gic_irq_do_undef

t gic_handle_irqT do_undefinstr

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

進程調度

sched_cpu_switch

T cpu_switch_tot pick_next_task_fair

進程切換、CFS調度器選任務

內存管理

pgd_do_page_fault

T pgd_alloct do_page_fault

頁表分配、頁錯誤處理

系統調用

__arm64_sys_

T __arm64_sys_mmapT __arm64_sys_exit

ARM64架構的mmap/exit系統調用

EFI引導

__efistub_efi_

A __efistub_primary_entry_offset

EFI stub啟動入口偏移量

2.4符號存在性內核配置判斷

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

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

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

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

這對內核裁剪優化非常有用:若不需要SMP功能,編譯時關閉CONFIG_SMPsmp_send_reschedule等符號會消失,減少內核體積。

三、調試時關注System.map:解決4大核心痛點

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

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

內核Oops是最常見的調試場景,例如打印:

Oops:0000000000000005[#1] PREEMPT SMPPCisat ffffffc00801c400

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

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

2.找到對應行:ffffffc00801c400 T die確認崩潰發生在die函數;

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

wKgZO2kamRaARWZwAAAGXTTy754087.png

流程圖

wKgZO2kamRaAVFHBAACEPmNZadc777.jpg


3.2內核恐慌棧回溯:補全函數調用鏈

當內核panic打印棧回溯(Backtrace)時,會輸出一串函數地址,例如:

Backtrace:ffffffc00801c400 → ffffffc00801c680 → ffffffc00801d8e0

通過System.map翻譯地址:

?ffffffc00801c400 → die(崩潰處理);

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

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

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

wKgZO2kamRaAcEztAAAqGb7Xe_E678.png

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

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

1.搜索foo符號:

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

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

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

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

perf record -g采樣內核性能時,結果會包含大量地址,例如:

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

可快速判斷性能瓶頸在進程切換,進而優化調度策略。

四、對開發的意義:從試錯精準

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

4.1提升內核調試效率

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

4.2保障模塊開發正確性

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

模塊開發流程圖

wKgZO2kamReADQXGAACng1Nxtrc619.png

4.3輔助內核裁剪與優化

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

?若不需要EFI引導,關閉CONFIG_EFI后,__efistub_前綴的符號會消失,說明裁剪成功;

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

4.4驗證版本兼容性

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

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

五、總結:System.mapkernel-6.1開發的基礎設施

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

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

下次遇到內核問題時,先打開System.map——它或許能幫你省下幾小時的調試時間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    4

    文章

    1467

    瀏覽量

    42871
  • 開發調試
    +關注

    關注

    0

    文章

    6

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于RK3576開發板的PWN使用說明

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

    基于RK3576開發板的RTC使用說明

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

    基于RK3576開發板的人臉識別算法

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

    如何移植EtherCAT Igh--基于米爾RK3576開發

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

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

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

    RK3576 vs RK3588:為何越來越多的開發者轉向RK3576

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

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

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

    【作品合集】米爾RK3576開發板測評

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

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

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

    如何米爾RK3576開發板上移植EtherCAT Igh

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

    新品體驗 | RK3576開發

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

    RK3576單板發布倒計時:RK3399與RK3576對比

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

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

    很多剛接觸瑞芯微 rk 系列芯片開發的小伙伴,在初次編譯基于 Linux 6.1 內核的系統時,很容易因為環境依賴問題卡殼。最近我在編譯 rk357
    的頭像 發表于 02-06 16:47 ?2570次閱讀
    初次編譯<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'>內核</b>踩坑記錄:從報錯終止到成功解決的完整流程

    RK3576音頻調試全紀錄

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

    迅為如何在RK3576上部署YOLOv5;基于RK3576構建智能門禁系統

    迅為如何在RK3576開發板上部署YOLOv5;基于RK3576構建智能門禁系統
    的頭像 發表于 11-25 14:06 ?1796次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構建智能門禁系統