關於核心符號表

2021-06-21 21:01:40 字數 1316 閱讀 6328

在編寫驅動的過程中,常會使用到export_symbol巨集來將定義的函式名匯出到核心符號表。以前只是簡單的知道如果乙個模組中定義的函式要提供給其他模組呼叫,就必須進行匯出。

這段時間在編譯單個模組的時候,因為沒編譯成功造成了函式沒定義而報警的情況,因此讓我有乙個機會對核心符號表的問題進行了乙個深入的學習和認識。 我們知道,如果乙個模組中使用到了另乙個模組中定義的函式,那麼在編譯該模組的時候,必然會列印出警告資訊,提示該函式沒有定義,當然這不會影響驅動的工作,可以忽略掉,只要在載入該驅動前,將使用到的函式的驅動提前載入就可以了。以前我編譯的都是單個原始檔構成的驅動模組,也曾出現過這種警告,不過我沒理會他,因為我明知道在其他模組裡定義了的。但是我現在編譯由多個原始檔構成的模組,居然也出現這個問題,所有函式都是在這個模組裡定義的,沒有用到任何其他模組的函式,起初,我很想不通,後來找到乙個理由可以說服自己,我以為凡是呼叫的函式都得到核心符號表裡去尋找對應的函式符號,找不到就會報警,而我正好沒匯出,報警也就正常了。當我把這些匯出語句加進去後,果然警告消失了,也讓我隱約覺得就是這個原因,但是很遺憾,我找不到任何可用的其他資訊來支援我的這種想法,後來發現確實是我的問題,猜測根本不成立,至於我為何報警,這個現象很奇怪,是我的問題,不具有普遍意義,就不列出了,只提醒一下,注意多原始檔與單檔案驅動編譯時makefile的變化就好了。 

下面就回歸正題,來闡述一下核心符號表這個東東,然後就可以知道我的猜測問題出在哪了。我們通常所說的核心符號表其實是乙個狹義的概念,它僅僅指能為所有驅動模組公用的那部分核心符號表,我們知道,驅動也是存在於核心空間的,它的每乙個函式每乙個變數都會有對應的符號,這部分符號也可以稱作核心符號,它們不導到就只能為自身所用,匯出後就可以成為公用,對於匯出的那部分的核心符號就是我們常說的核心符號表。insmod的時候並不是所有的函式都得到核心符號表去尋找對應的符號,如前面所說,每乙個驅動在自己分配的空間裡也會存在乙份符號表,裡面有關於這個驅動裡使用到的變數以及函式的一些符號,首先驅動會在這裡面找,如果發現某個符號是這裡沒有了,那麼就會去公共核心符號表中搜尋,搜素到了,則該模組載入成功,搜尋不到則該模組載入失敗。

這裡還補充一點,對於2.4核心和2.6核心的核心符號表是有區別的,2.4核心預設情況下模組中的非靜態全域性變數以及非靜態函式在模組載入後會自動匯出到核心符號表中,而2.6核心預設情況下是不會自動匯出的,需要顯式呼叫巨集export_symbol才能匯出。匯出的符號前面一般標註有r標記。可以通過nm -l xx.ko來檢視某乙個模組裡的符號情況。或者通過檢視核心符號表檔案也行。對於2.4是:cat /proc/ksyms,對於2.6是:cat /proc/kallsyms.最後來點總結,對於乙個模組來講,如果僅依靠自身就可以實現自己的功能,那麼可以不需要匯出任何符號,只有其他模組中需要使用到該模組提供的函式時,就必須要進行匯出操作。

核心符號表

linux核心為了實現模組化,需要提供乙個公共的核心符號表,它包含了所有的全域性核心項 函式以及變數 的位址。當模組載入到核心中後,它所匯出的任何符號都將成為核心公共符號表的一部分。核心模組只需要實現自己的功能而無需匯出任何符號,但這樣其他模組將無法使用該模組的功能,乙個新的模組可以使用自己其他模組...

linux核心符號表

所謂核心符號表就是在核心內部函式或變數中可供外部引用的函式和變數的符號表。在 2.6 核心下,使用以下命令可以看到核心符號表 引用 beyes linux beyes cat proc kallsyms more c0100000 t text c0100000 t startup 32 c0100...

linux核心符號表

所謂核心符號表就是在核心內部函式或變數中可供外部引用的函式和變數的符號表。在 2.6 核心下,使用以下命令可以看到核心符號表 引用 beyes linux beyes cat proc kallsyms more c0100000 t text c0100000 t startup 32 c0100...