linux内核模块常见问题
From: http://debug-sai.blogbus.com/logs/45569599.html
一
在編譯內(nèi)核模塊時,出現(xiàn)
make[1]: 正在進入目錄 `/usr/src/linux-2.6.28'
? ERROR: Kernel configuration is invalid.
???????? include/linux/autoconf.h or include/config/auto.conf are missing.
???????? Run 'make oldconfig && make prepare' on kernel src to fix it.
? WARNING: Symbol version dump /usr/src/linux-2.6.28/Module.symvers
?????????? is missing; modules will have no dependencies and modversions.
? Building modules, stage 2.
。。。。
的錯誤,回到/usr/src/linux-2.6.28目錄下,如下操作
sudo make oldconfig
sudo make prepare
再此編譯內(nèi)核模塊,再出錯
/bin/sh: scripts/mod/modpost: not found
回到/usr/src/linux-2.6.28目錄下,如下操作
sudo make scripts
OK,可以編譯內(nèi)核模塊了
二
如果加載模塊時出現(xiàn)下面錯誤
insmod: error inserting 'hellomod.ko': -1 Invalid module format
此時,用dmesg在最后一行應(yīng)該看到類似下面的提示:
Dec 19 13:42:29 localhost kernel: hellomod: version magic '2.6.24.2 SMP mod_unload 686 4KSTACKS ' should be '2.6.27.7-134.fc10.i686SMP mod_unload 686 4KSTACKS '
那99%是內(nèi)核版本號對不上,也就是version magic不上,辦法是:修改源目錄下的Makefile,把Makefile第1-4行的值改為當前內(nèi)核一樣的值
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 24
EXTRAVERSION = .2
NAME = Err Metey! A Heury Beelge-a Ret!
也有可能是配置不當,用modinfo hello.ko查看,見
http://hi.baidu.com/52hack/blog/item/1f53b1387df83fcad462254a.html
三
當編譯完內(nèi)核,安裝后,/usr/src/下的源文件包通常我會清除掉一些編譯內(nèi)核中途產(chǎn)生的文件,比如
sudo make-kpkg clean來清除,之后是本文“一”中描述的錯誤,搞定后。如果編譯時出現(xiàn)
WARNING: Symbol version dump /usr/src/linux-2.6.26/Module.symvers
?????????? is missing; modules will have no dependencies and modversions.
但是依然能編譯模塊,然后加載時出現(xiàn)
insmod: error inserting 'hello.ko': -1 Invalid module format
再用dmesg查看顯示
no symbol version for struct_module
具體原因見
http://blog.chinaunix.net/u/12592/showart_1671442.html
解決方案我找遍google也沒見到實際點的操作,唯一的提示來源于
http://forum.byr.edu.cn/wForum/disparticle.php?boardName=Embedded_System&ID=4183&page=1&pos=-1&listType=0
看錯誤提示也知道我們要獲得Module.symvers,/lib/modules/你的linux版本號/下倒是有個Module.symvers,我把那個拷貝過來仍然不對,后來想即然我們不需要內(nèi)核源代碼也可以編譯加載模塊(具體見http://forum.ubuntu.org.cn/viewtopic.php?f=97&t=208453),那么這個東西系統(tǒng)應(yīng)該早就有了,只可能在頭文件下,也就是在未編譯內(nèi)核前/usr/src/下本來就有個linux-XXX的文件夾里的,本來事情到這就結(jié)束了,然而不幸的是那個文件夾被我手賤,在裝完內(nèi)核刪了。。。。還好,我們編譯完內(nèi)核后有兩個deb,一個image的,一個headers的,我們dpkg -i 那個header的deb,就會在/usr/src/下產(chǎn)生一個頭文件文件夾,現(xiàn)在把里面的Module.symvers拷貝到/usr/src/linux-XXX/下吧,問題就搞定了~
?
另外,如果在編譯過程中出現(xiàn)進不了XX目錄這類的問題,看看/lib/modules/你的linux版本號/這個目錄下的build和source的軟鏈接是不是鏈接到/usr/src/linux-XXX/下了。
四
最后一個問題,不是問題的問題----編譯好后,成功加載,終端中無顯示
《linux設(shè)備驅(qū)動edition3》有如下解釋:
依據(jù)你的系統(tǒng)用來遞交消息行的機制, 你的輸出可能不同. 特別地, 前面的屏幕輸出是來自一個字符控制臺; 如果你從一個終端模擬器或者在窗口系統(tǒng)中運行 insmod 和 rmmod, 你不會在你的屏幕上看到任何東西. 消息進入了其中一個系統(tǒng)日志文件中, 例如 /var/log/messages (實際文件名子隨 Linux 發(fā)布而變化)具體見
http://blog.chinaunix.net/u3/99423/showart_1983683.html
總結(jié)
以上是生活随笔為你收集整理的linux内核模块常见问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: url字符转义
- 下一篇: Linux tcpdump命令用法详解