內核符號導出

1、創建實驗目錄

#mkdir /home/guoqian/4-1-4

#cd /home/guoqian/4-1-4

2、編寫內核模塊代碼calculate.c hello.c Makefile

這是calculate.c

這是hello.c

 

這是Makefile

3、首先來看不導出內核符號的情況

    3、1屏蔽calculate.c

     /*EXPORT_SYMBOL(add_integar);

     EXPORT_SYMBOL(sub_integar);*/

    3、2編譯內核模塊 #make

    3.3加載內核模塊

     #insmod calculate.ko

     #lsmod | grep calculate   使用lsmod查看該內核模塊是否被加載

#insmod hello.ko   加載內核模塊,注意觀察模塊加載時的輸出信息

 

說明大家可以發現在加載內核hello內核模塊時,報出錯誤語句“hello.ko -I Unkonwn symbol in module”,意思是在加載模塊時不能識別一些符號。爲什麼呢?因爲hello.c中使用了add_integar和sub_integar這兩個 內核符號,而我們的內核又沒有導出這些符號,所以就不能使用。那我們如何知道所使用的內核符號是否已導出,內核中又導出了哪些符號?別急,接着往下看

3、4查看當前環境下內核導出了哪些符號

#cat /proc/kallsyms >log

#vi log

說明:大家可以看到內核導出了很多符號,爲了能快速的找到我們所需要的符號,使用重定向和grep來搜索

#cat /proc/kallsyms | grep add_integar

#cat /proc/kallsms | grep sub_integar

說明:通過觀察發現,雖然/proc/kallsyms中有關鍵字add_integar和sub_integar,但這並不是我們所需要的內核符號,也就是說當前內核 沒有導出我們所需要的內核符號

3、5卸載內核模塊

#rmmod calculate

#lsmod

4、接着來看內核符號導出的情況

  4、1修改calculate.c

4、2編譯內核模塊

#make clean

#make

4、3加載內核模塊

#insmod calculate.ko

注:先加載內核模塊calculate.ko

#insmod hello.ko

注:再加載內核模塊hello.ko

說明:通過打印信息可以發現,當我們把所需要的內核符號導出時,hello.ko內核模塊被正確加載

#lsmod | grep calculate

#lsmod | grep hello

4、4查看當前環境下內核是否導出了需要的符號

#cat /proc/kallsyms | grep add_integar

說明:上圖語句“__ksymtab_add_integar”表明內核符號add_integar已導出。
#cat /proc/kallsyms | grep sub_integar
說明:上圖語句“__ksymtab_sub_integar”表明內核符號sub_integar已導出。
4、5卸載內核模塊
#rmmod hello
注:必須先卸載內核模塊hello,因爲在內核卸載函數中要使用到內核導出的符號sub_integar。
 
說明:在模塊寫在函數中,內核模塊卸載函數hello_exit被調用,該函數使用了內核導出的符號sub_integar。
#rmmod calculate
#lsmod | grep hello
#lsmod | grep calculate
說明:通過lsmod發現內核模塊hello,calculate已經成功從系統中卸載了。
總結:在內核與那代碼中,經常會看到內核符號導出;所以熟練的使用內核符號導出就相當必要,總結內核符號導出步驟如下:
1、定義要導出的函數
2、使用EXPORT_SYMBOL(符號)導出定義的內核符號,
這裏的符號即是我們的函數名。
發佈了6 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章