在基于bf609開發(fā)驅(qū)動時,,先做了最簡單的字符型設(shè)備驅(qū)動嘗試,。編譯環(huán)境是在PC
xp下運行的vmware ubuntu10.04。交叉編譯環(huán)境為bfin-uclinux,,linux
kernel為ADI網(wǎng)站提供的最新代碼,。
在驅(qū)動代碼寫好后,配置好konfig文件和makefile文件,設(shè)置為module,。make menuconfig后,,進(jìn)行make
modules SUBDIRS=drivers/char。將module型的驅(qū)動生成.ko文件,。
將.ko文件下載到板上后,,進(jìn)行insmod操作。發(fā)現(xiàn)反饋的信息為:
mydevice: version magic '3.3.0-ADI-2012R1-pre+ mod_unload
modversions ' should be '3.3.0-ADI-2012R1-pre-00619-gab55153-dirty
mod_unload '
insmod: can't insert 'mydevice.ko': invalid module format
在網(wǎng)上查了很多資料,,知道是模塊的編譯工具版本和內(nèi)核的編譯工具版本不對所導(dǎo)致,。但是之前沒有做過驅(qū)動開發(fā)。很多知識不太清楚,。不知道哪兒出錯了,。由于進(jìn)
行blackfin開發(fā)時,軟件開發(fā)環(huán)境根據(jù)官網(wǎng)提供的信息,,可有兩種情況,。一種是通過官網(wǎng)提供的uClinux包來開發(fā)uClinux,。一種是通過官網(wǎng)
提供的buildroot包來開發(fā)linux,。由于ADI從bf60X開始,對于bf60X的開發(fā)支持只在buildroot上進(jìn)行,。因為我的開發(fā)包為
buildroot,。針對剛才insmod的問題,經(jīng)過仔細(xì)檢查,,發(fā)現(xiàn)在環(huán)境變量設(shè)置tools
chain時,,出現(xiàn)了問題。板上下載好的uImage文件是buildroot編譯所得,,模塊編譯是在linux
kernel下編譯所得,,而環(huán)境變量設(shè)置時又出現(xiàn)了問題,導(dǎo)致了版本信息不同,。
不過從給出的message來看,,模塊的vermagic信息為
3.3.0-ADI-2012R1-pre+ mod_unload modversions
。它是有kernel目錄下的include/linux/vermagic.h文件決定的,。其中具體的信息又由文件中vermagic
string決定,。
另外在進(jìn)行menuconfig時,進(jìn)行module設(shè)置時,,有以下幾項:
再由打印出來的module vermagic:3.3.0-ADI-2012R1-pre+ mod_unload
modversions 可知,。3.3.0-ADI-2012R1-pre+為kernel
version信息。至于后面的那個+號是沒有顯示kernel的補(bǔ)丁信息,。mod_unload 為上圖module
menuconfig時設(shè)置的,,保證模塊與內(nèi)核此處一致就行,還有后面的modversions與此類似。但是非常重要的一點是,,在vermagic
string里面的第一條UTS_RELEASE,,規(guī)定了模塊中kernel
version的信息,UTS_RELEASE在include/generated/UTSRELEASE.h中可以查看,。但是該文件只有在menuconfig時,,配置了
此項才會生成。這樣編譯生成的.ko文件vermagic信息才會對應(yīng)kernel完整的version信息,。
至此,,insmod關(guān)于版本信息的問題解決了。
但是這個問題后,,insmod時,,又出現(xiàn)
Unknown symbol _mcount (err 0)的錯誤。
目前正在處理中,。