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源碼文件,那個源碼文件一定是編譯過內核的源碼文件。那個內核應該就是你目標板正在運行的內核。
