insmod的時候並不是所有的函式都要到核心符號表去尋找對應的符號,每個驅動在自己的分配的空間裡也會存在乙份符號表,裡面有關於這個驅動裡使用到的變數以及函式的一些符號,驅動會首先在這裡找,如果發現找不到就會去公共核心符號表中搜尋。2.4核心預設情況下中的非靜態全域性變數以及非靜態函式在模組載入後都會自動匯出到核心符號表中,而2.6核心預設情況下是不會自動匯出的,需要顯示的呼叫巨集export_symbol()才能匯出。可以通過檢視核心符號表檔案cat /proc/kallsyms或者nm -l xx.ko 來檢視乙個模組裡的符號情況(檢視xx.ko檔案資訊,匯出的符號前面一般有r標誌)
nm -l symbol_depend0.ko
00000000 r __kstrtab_add (表示add函式匯出的核心符號)
00000000 r __ksymtab_add
0000001c r __mod_author28
00000000 r __mod_description29
00000028 r __mod_license27
00000040 r __mod_vermagic5
00000034 r __module_depends
00000000 d __this_module
例子:symbol_depend1.ko 依賴於 symbol_depend0.ko,因為symbol_depend1.ko要用到symbol_depend0.ko匯出的add(int, int)函式
/*
symbol_depend0.c
*/#include #include #include int add(int, int);
export_symbol(add);
int add(int a, int b)
static int __init symbol_depend0_init(void)
static void __exit symbol_depend0_exit(void)
module_init(symbol_depend0_init);
module_exit(symbol_depend0_exit);
module_license("gpl");
module_author("bang");
module_description("module study");
module_supported_device("none");
makefile:
config_kern_symbol ?=m
obj-$(config_kern_symbol) +=symbol_depend0.o
install_dir = /nfs
kern_dir = /home/bang/system_built/android-kernel-samsung-dev-gec210
module:
$(make) -c $(kern_dir) m=`pwd` modules
install:
$(make) -c $(kern_dir) m=`pwd` install_mod_path=$(install_dir) modules_install
clean:
rm -rf *.o *.ko *.mod.c *.order *.symvers
以上是symbol_depend0.c它匯出了add函式給下面的symbol_depend1,c使用
/*
symbol_depend1.c
*/#include #include #include #include extern int add(int, int);
static int __init symbol_depend1_init(void)
static void __exit symbol_depend1_exit(void)
module_init(symbol_depend1_init);
module_exit(symbol_depend1_exit);
module_license("gpl");
module_author("bang");
module_description("module study");
module_supported_device("none");
#makefile檔案
config_kern_symbol1 ?=m
obj-$(config_kern_symbol1) +=symbol_depend1.o
install_dir = /nfs
kern_dir = /home/bang/system_built/android-kernel-samsung-dev-gec210
module:
$(make) -c $(kern_dir) m=`pwd` modules
install:
$(make) -c $(kern_dir) m=`pwd` install_mod_path=$(install_dir) modules_install
clean:
rm -rf *.o *.ko *.mod.c *.order *.symvers
命令:cat /proc/kallsyms 可以檢視核心符號
載入核心模組時先insmod symbol_depend0.ko 再載入insmod symbol_depend1.ko,解除安裝時順序相反
當然可以使用modprobe命令載入,他會自動根據依賴規則去載入對應的驅動模組步驟如下:
1、mkdir /lib/modules/2.6.35.7/ (2.6.35.7目錄名是核心的發布版本號要對應一致)
2、vi /lib/modules/2.6.35.7/modules.dep(依賴規則)
內容:/mnt/nfs/symbol_depend0,ko
/mnt/nfs/symbol_depend1.ko: /mnt/nfs/symbol_depend0.ko (注意要有空格)
3、modprobe symbol_depend1.ko (系統會自動檢視modules.dep然後載入先關的模組)
4、modprobe -r symbol_depend1.ko (解除安裝模組並解除安裝它以來的模組)
如果以上兩個模組在編譯時使用make install則會在安裝的目錄下(這裡是/nfs)自動生成lib目錄樹,裡面包含他們的依賴關係,我們可以參照這個lib目錄寫/lib/modules/2.6.35.7/下的內容,或者直接copy,用make install時生成的lib目錄,linux系統的.ko檔案一般放在/lib/modules/$(shell uname -r)/ .
└── lib
└── modules
└── 2.6.35.7
├── extra
│ ├── symbol_depend0.ko
│ └── symbol_depend1.ko
├── modules.alias
├── modules.alias.bin
├── modules.ccwmap
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.ieee1394map
├── modules.inputmap
├── modules.isapnpmap
├── modules.ofmap
├── modules.pcimap
├── modules.seriomap
├── modules.softdep
├── modules.symbols
├── modules.symbols.bin
└── modules.usbmap
Linux核心驅動模組的刪除
今天看了 linux裝置驅動開發詳解 的第四章模組和第五章檔案。學長給了乙個的任務 刪除linux核心中的dm9000的驅動模組,重新編譯核心。這篇文章現在寫肯定還不夠完善,我之後我會再補全,所以先打乙個 的標記。首先,我從檔案中找到dm9000驅動模組所在位置,在 drives net下。於是,我...
16 驅動模組的符號表與符號匯出
檢視elf檔案的資訊 readelf test.ko a ko檔案組成 1 elf檔案頭 elf header magic 7f 45 4c 46 0101 0100 0000 0000 0000 0000 class elf32 data 2 s complement,little endian ...
Ubuntu編譯核心驅動模組
1 編寫hello world.c核心模組原始檔 2 檢視核心版本。我的主機安裝的是ubuntu14.04核心版本是3.13.0 24 generic 3 編寫makefile指令碼 4 編譯與測試 執行make命令開始編譯,編譯通過。載入核心模組 insmod hello world.ko 檢視載...