insmod: can't insert 'led.ko': invalid module format詳細解釋



insmod: can't insert 'led.ko': invalid module format

之前在Imx257學習版固件編寫的驅動想直接移植imx257核心板的開發板上。以為2個板子的源碼的引腳定義一樣就沒什么問題了。殊不知問題很多。


我們輸入dmesg |tail
 


在log中我們看到2個版本不匹配。

在這兒我們需要明白一個原理,我們編譯驅動程序的Makefile


 
有一個KDIR指的是Linux源碼文件,那個源碼文件一定是編譯過內核的源碼文件。那個內核應該就是你目標板正在運行的內核。

如果沒有你的Makefile沒有滿足上述的情況你可能會出現下面情況


內核是純凈的沒有編譯過


 
你編譯這個驅動可能會提示你丟失文件,或者出現內核的警告,即使生成了驅動文件加載也是失敗,也許還看不到log




是編譯過得內核但是內核的版本不對

我的項目使用周立功的固件,我是在學習版固件編寫驅動自然在學習板上面加載都是ok。后面正式的項目改為工業板的固件,發現他們的內核版本的信息不對,導致出現上面的問題。解決方法
1、 可以在編譯內核的時候禁止內核加載驅動時進行版本檢測(特殊情況這樣處理)
2、 使用正確的內核環境編寫,就是用工業板的固件環境進行驅動編寫
 
編譯過的內核環境但編譯的.config不一樣

我們看驅動的Makefile中並沒有寫明編譯的交叉工具鏈why?
應為驅動的編譯會使用編譯內核的交叉工具鏈,如果內核.config寫錯了,交叉工具鏈應該也是不對。那么我們的驅動編譯的交叉工具鏈也會寫錯

我們可以使用如下命令查看


 
錯誤


觀看vermagic 看到了gcc么這不是gcc編譯的么,我需要arm-Linux-gcc。









總結
KDIR指的是Linux源碼文件,那個源碼文件一定是編譯過內核的源碼文件。那個內核應該就是你目標板正在運行的內核。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM