linux核心中符號位址的獲取

2021-09-21 04:39:13 字數 1020 閱讀 5541

有些核心函式或者核心變數是不匯出的,但是確實需要用,那該怎麼辦?因此尋找核心符號位址就有必要進行一下總結,更有甚,如果想找一條特定的指令,比如movl的指令位址,那更需要投入一些精力!總的來說,我總結了下面五種方式:

1.通過procfs中的kallsym檔案或者system.map檔案直接查詢

這種方式借助於檔案,依賴於檔案的存在,不需要什麼程式設計能力,只要會在檔案中查詢資訊即可

2.google一下

這種方式借助於網際網路,依賴你對資訊的篩選能力。最有代表性的,尋找system_call和sys_call_table的位址,網上會說先找到0x80個中斷描述符,然後在尋找機器碼特徵。這種方式實際上廣泛用於替換系統呼叫這種小伎倆。

3.使用dump_stack

這種方式需要在你想得到的位址呼叫鏈條的下游呼叫dump_stack,然後通過dmesg資訊得到相應的位址資訊。同理等價的方式就是故意製造錯誤,迫使核心列印位址。

4.利用棧結構和棧原理尋找

記住棧中會有什麼資訊,一般會有引數位址資訊,會有乙個個的棧幀資訊,每當呼叫call指令的時候,還會將下一條指令的位址壓入棧中。通過這些資訊我們可以得到大量的位址資訊。

5.從/dev/mem中搜尋

這個方式最有技術含量,也最困難,然而什麼外界工具都不需要,甚至都不需要你懂程式語言。然而需要你對機器碼指令十分精通,對記憶體布局十分精通,它實際上是一種機器語言的編碼方式

從上述方法可以看出,從1到5,對外部工具的依賴越來越少,然而對自身的知識儲備要求越來越高,因此完成一件事的成本貌似是守恆的。如果乙個人的知識儲備非常豐富,本身有十分聰明,他會使用哪種方式呢?會使用第五種方式嗎?我想絕對不!他肯定嘗試使用第一種方式,然後第二種...他很有可能永遠不會使用第五種方式,雖然他有能力完成!這就是說,在解決問題的時候,我們不會在乎難度和能力,我們只在乎成本,因此我們總是喜歡從阻力最小的方向上切入,有簡單的方式就不使用更複雜的方式,這也印證了簡單就是美的普世原則。在力求簡單的過程中,我們不得不積累更多的知識,進行更多的嘗試...

想起一句廣告詞,加速,是為了放慢腳步!

常用核心中斷符號解釋 linux

在列舉型別irqreturn定義在include linux irqreturn.h檔案中。unsigned long flags 中斷處理的屬性,與中斷管理有關的位掩碼選項,有一下幾組值 define irqf disabled 0x00000020 中斷禁止 define irqf sample...

在核心中獲取pmem裝置的虛擬位址

pmem的配置可以參考沒有的選項可以不選。不要少選了,不然沒有pmem裝置滴。配置完之後,想要在核心中獲取pmem的虛擬位址,就先來個系統呼叫吧。我的核心是4.4.4。所以在arch x86 entry syscall 64.tbl中新增編號,順序新增即可。然後在include linux sysc...

在核心中尋找核心符號表

在使用者空間中可以用如下方法得到 1.從 system.map 檔案直接得到位址。例如,要得到 do fork 的位址,可以在命令列執行 grep do fork usr src linux system.map 2.使用 nm 命令。nm vmlinuz grep do fork 3.從 proc...