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

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

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

四種獲取內(nèi)核函數(shù)地址的方法

CHANBAEK ? 來(lái)源:嵌入式Linux充電站 ? 作者: Vincent ? 2023-11-17 16:58 ? 次閱讀

圖片

在內(nèi)核調(diào)試中,經(jīng)常需要知道某個(gè)函數(shù)的地址,或者根據(jù)函數(shù)地址找到對(duì)應(yīng)的函數(shù),從而進(jìn)行更深一步的debug。

下面介紹四種獲取內(nèi)核函數(shù)地址的方法:

1、System.map

在編譯Linux內(nèi)核時(shí),會(huì)產(chǎn)生一個(gè)內(nèi)核映像文件System.map,也叫 內(nèi)核符號(hào)表 。

內(nèi)核符號(hào)表是一個(gè)映射,它將內(nèi)核代碼段中的地址映射到對(duì)應(yīng)的函數(shù)名或全局變量名。

System.map文件中,每一行都包含一個(gè)內(nèi)核符號(hào),每個(gè)符號(hào)包含三部分:

  • 地址 :符號(hào)在內(nèi)核內(nèi)存中的地址。
  • 類型 :符號(hào)的類型。例如,"T"表示該符號(hào)是一個(gè)在代碼段中的函數(shù)。
  • 名稱 :符號(hào)的名字,可以是函數(shù)名或者變量名。

例如,我們要查找名為“do_fork”的函數(shù)的地址,可以使用以下命令:

grep ' do_fork' System.map

然后會(huì)得到類似于這樣的輸出:

c0105020 T do_fork

這代表,c0105020就是函數(shù)do_fork的地址,T代表該符號(hào)是個(gè)函數(shù)。

或者,直接打開(kāi)System.map搜索對(duì)應(yīng)函數(shù)名或者地址。System.map內(nèi)容類似如下:

c0004000 A swapper_pg_dir
c0008000 T __init_begin
c0008000 T _sinittext
c0008000 T _stext
c0008000 T stext
c0008034 t __enable_mmu
c0008060 t __turn_mmu_on
......

A、T、t等都代表不同的類型,具體類型的定義可參考:

類型說(shuō)明
A該符號(hào)的值是不能改變的,等于const
B該符號(hào)來(lái)自于未初始化代碼段bss段
C該符號(hào)是通用的,通用的符號(hào)指未初始化的數(shù)據(jù)。當(dāng)鏈接時(shí),多個(gè)通用符號(hào)可能對(duì)應(yīng)一個(gè)名稱,如果該符號(hào)在某一個(gè)位置定義,這個(gè)通用符號(hào)被當(dāng)做未定義的引用。不明白,內(nèi)核中也沒(méi)有該類型的符號(hào)
D該符號(hào)位于初始化的數(shù)據(jù)段
G位于初始化數(shù)據(jù)段,專門對(duì)應(yīng)小的數(shù)據(jù)對(duì)象,比如global int x,對(duì)應(yīng)的大數(shù)據(jù)對(duì)象為 數(shù)組類型等
I到其他符號(hào)的間接引用,是對(duì)于a.out文件的GNU擴(kuò)展,使用非常少
N調(diào)試符號(hào)
R只讀代碼段的符號(hào)
SBSS段(未初始化數(shù)據(jù)段)的小對(duì)象符號(hào)
T代碼段符號(hào),全局函數(shù),t為局部函數(shù)
U未定義的符號(hào)
V該符號(hào)是一個(gè)weak object,當(dāng)其連接到為定義的對(duì)象上上,該符號(hào)的值變?yōu)?
W類似于V
-該符號(hào)是a.out文件中的一個(gè)stabs symbol,獲取調(diào)試信息
?未知類型的符號(hào)

2、vmlinux

vmlinux也是Linux編譯出來(lái)的內(nèi)核映像文件,可以通過(guò)nm、objdumpreadelf等工具來(lái)查看它的符號(hào)表,從而獲取函數(shù)地址。

2.1 nm讀取vmlinux

nm命令是用于查看二進(jìn)制文件(如可執(zhí)行文件、目標(biāo)文件、庫(kù))的符號(hào)表的工具,所以可以用nm命令來(lái)讀取vmlinux里的符號(hào)表。

  • nm查找vmlinux中函數(shù)名為do_fork的地址:
nm vmlinux | grep "do_fork"
  • nm查找vmlinux中地址為c0105020的符號(hào):
nm vmlinux | grep c0105020

nm命令的輸出,與System.map類似,會(huì)的得到類似于以下的輸出:

c0105020 T do_fork

2.2 objdump反匯編vmlinux

objdump工具用于反匯編,可以將vmlinux反匯編出來(lái),得到的反匯編文件就會(huì)包含函數(shù)名和對(duì)應(yīng)的 地址 ,可以直接查看文本內(nèi)容。

  • 使用objdump查看vmlinux函數(shù)地址
objdump -d vmlinux | grep "函數(shù)名"

這會(huì)返回與指定函數(shù)名匹配的符號(hào)的地址、類型和名稱。objdump-d選項(xiàng)表示反匯編代碼。

也可以將vmlinux的內(nèi)容全部反匯編出來(lái),重定向到一個(gè)文件,然后直接查看文本內(nèi)容:

objdump -D vmlinux > vmlinux_dump.txt

上述命令會(huì)將vmlinux所有內(nèi)容反匯編,并將結(jié)果輸出到vmlinux_dump.txt文件中,-D表示反匯編所有代碼段。

2.3 readelf讀取vmlinux

使用readelf也可以讀取vmlinux的符號(hào)表,命令如下:

readelf -s vmlinux

由于vmlinux比較大,如果要查找某個(gè)函數(shù)的地址,需要使用grep進(jìn)行過(guò)濾。

例如,找到do_fork函數(shù)的地址,你可以使用以下命令:

readelf -s vmlinux | grep "do_fork"

然后,你就會(huì)看到類似這樣的輸出:

56481: c10601e0    96 FUNC    GLOBAL DEFAULT    1 do_fork

輸出內(nèi)容表示,do_fork函數(shù)的地址是c10601e0。

3、/proc/kallsyms

vmlinux是編譯時(shí)生成的,假設(shè)你沒(méi)有vmlinux這個(gè)文件,只有正在運(yùn)行的Linux系統(tǒng),此時(shí)也可以通過(guò)/proc/kallsyms獲取函數(shù)地址。

/proc/kallsyms是一個(gè)由運(yùn)行中的 內(nèi)核動(dòng)態(tài)生成的虛擬文件 ,它反映了 當(dāng)前運(yùn)行的內(nèi)核的狀態(tài)

通常這個(gè)節(jié)點(diǎn)是不會(huì)打開(kāi)的,因?yàn)闀?huì)增加內(nèi)核大小,要使用這個(gè)節(jié)點(diǎn),需要打開(kāi)內(nèi)核選項(xiàng):

CONFIG_KALLSYMS=y

如果想獲取do_fork函數(shù)的地址,可以使用以下命令:

cat /proc/kallsyms | grep " do_fork"

然后會(huì)返回一個(gè)包含do_fork函數(shù)地址的行,如:

ffffffff810b57b0 T do_fork

輸出內(nèi)容表示do_fork函數(shù)的地址是ffffffff810b57b0

4、內(nèi)核接口

也可以在代碼中獲取內(nèi)核符號(hào)表,同樣需要打開(kāi)內(nèi)核選項(xiàng)CONFIG_KALLSYMS=y。

kallsyms_lookup_name

  • 已知函數(shù)名,獲取地址:
kallsyms_lookup_name("函數(shù)名" )

該函數(shù)會(huì)返回對(duì)應(yīng)函數(shù)名的地址。

sprint_symbol

  • 已知地址,返回對(duì)應(yīng)符號(hào):
#include < linux/kallsyms.h >

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

    關(guān)注

    3

    文章

    1392

    瀏覽量

    40610
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11378

    瀏覽量

    211342
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    593

    瀏覽量

    34213
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4355

    瀏覽量

    63318
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    四種模擬輸入信號(hào)的保護(hù)電路實(shí)現(xiàn)方法

    本文介紹了四種模擬輸入信號(hào)的保護(hù)電路的實(shí)現(xiàn)方法。
    發(fā)表于 03-28 09:55 ?1344次閱讀

    FPGA 設(shè)計(jì)的四種常用思想與技巧

    FPGA 設(shè)計(jì)的四種常用思想與技巧FPGA設(shè)計(jì)的四種常用思想與技巧 討論的四種常用FPGA/CPLD設(shè)計(jì)思想與技巧:乒乓操作、串并轉(zhuǎn)換、流水線操作、數(shù)據(jù)接口同步化,都是FPGA/CPLD 邏輯設(shè)計(jì)
    發(fā)表于 08-11 10:30

    請(qǐng)問(wèn)MATHLIB的庫(kù)函數(shù)為什么每個(gè)都有四種?有什么區(qū)別?

    mathlib_c66x_3_0_1_1:請(qǐng)問(wèn)大神們,MATHLIB的庫(kù)函數(shù)為什么每個(gè)都有四種?比如說(shuō)單精度的Atansp就有這四種:(1)floatatansp(float a)(2
    發(fā)表于 07-24 07:39

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應(yīng)用
    發(fā)表于 01-12 07:16

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應(yīng)用
    發(fā)表于 02-02 06:58

    IO口的四種使用方法

    IO口的四種使用方法高阻態(tài)的典型應(yīng)用
    發(fā)表于 02-19 07:23

    Word技巧:快速實(shí)現(xiàn)雙面打印的四種方法

    Word技巧:快速實(shí)現(xiàn)雙面打印的四種方法 在日常辦公中要求對(duì)文檔進(jìn)行雙面打印是很常見(jiàn)的,在打印機(jī)沒(méi)有自帶雙面打印功能的情況下,
    發(fā)表于 12-29 10:31 ?1576次閱讀

    教你四種神奇的電腦開(kāi)機(jī)方法

    教你四種神奇的電腦開(kāi)機(jī)方法 如果有人問(wèn)你,你的電腦怎么開(kāi)機(jī)?回答不外乎是:“直接按電腦機(jī)箱上的電源開(kāi)關(guān)按鈕不就得了”。這當(dāng)然是最簡(jiǎn)
    發(fā)表于 02-23 15:20 ?1030次閱讀

    如何延長(zhǎng)iPhone的壽命 告訴你四種方法

    本文主要介紹了如何延長(zhǎng)iPhone壽命的四種簡(jiǎn)單方法,具體的跟隨小編一起來(lái)了解一下。
    的頭像 發(fā)表于 03-31 07:19 ?7494次閱讀

    四種特殊的線路板電鍍方法

    本視頻主要詳細(xì)介紹了四種特殊的線路板電鍍方法,分別是指排式電鍍、通孔電鍍、卷輪連動(dòng)式選擇鍍、刷鍍。
    的頭像 發(fā)表于 05-28 17:42 ?5891次閱讀

    直流電阻測(cè)試儀的四種使用方法

    本文主要闡述了直流電阻測(cè)試儀的四種使用方法。
    發(fā)表于 10-24 10:41 ?1.4w次閱讀

    四種常用的諧波治理方法

    綠+波杰能從事諧波治理20余年,結(jié)合自己20多年的從業(yè)經(jīng)驗(yàn),以及相關(guān)的資料、研究,綠+波杰能將諧波治理的基本方法進(jìn)行了總結(jié),與大家一同探討之。綠+波杰能常用的諧波治理的基本方法,有以下四種
    發(fā)表于 03-01 16:09 ?1.5w次閱讀

    改善您的模數(shù)轉(zhuǎn)換器系統(tǒng)電源抑制狀況的四種方法

    改善您的模數(shù)轉(zhuǎn)換器系統(tǒng)電源抑制狀況的四種方法
    發(fā)表于 11-04 09:51 ?1次下載
    改善您的模數(shù)轉(zhuǎn)換器系統(tǒng)電源抑制狀況的<b class='flag-5'>四種方法</b>

    四種方法實(shí)現(xiàn)LED點(diǎn)亮

    四種方法實(shí)現(xiàn)LED點(diǎn)亮程序分享
    發(fā)表于 12-28 10:03 ?3次下載

    干貨 | 數(shù)字萬(wàn)用表四種妙用方法,你知道么?

    干貨 | 數(shù)字萬(wàn)用表四種妙用方法,你知道么?
    的頭像 發(fā)表于 01-05 09:52 ?1230次閱讀