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