[轉貼]驅動模組編譯時的 kernel版本問題

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[轉貼]驅動模組編譯時的 kernel版本問題

文章moto » 週日 5月 25, 2003 8:52 pm

發信人: chihhua64.bbs@bbs.et.ntust.edu.tw (C.H.L), 看板: Linux
標 題: Re: 驅動模組編譯時的 kernel版本問題
發信站: 台灣科大電子BBS (Sun May 18 21:06:29 2003)
轉信站: SayYa!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.civil.ncku!n
Origin: bbs.et.ntust.edu.tw

※ 引述《letsgo@ms6.url.com.tw (老貢生)》之銘言:

>> Palatis wrote:
>
>>> > -----BEGIN PGP SIGNED MESSAGE-----
>>> > Hash: SHA1
>>> > 老貢生 wrote:
>>> > /usr/src/linux?
>>> > include path?
>
>> 還真被你說對了,原來我的 asm,asm-generic 和 linux 三個目錄,
>> 是直接用 mandrake 幫我安裝好的在 /usr/include 下的三個,
>> 聽你這麼一說,我把他們改 link 到我的 /usr/src/linux/include
>> 相對應路徑下,就 OK 了。
>> 不過還是納悶,為何遵照 Mandrake 自己的 include 辦法不通,
>> 還要自己去改設才通?我這部份是一直按照 mandrake 原安裝設定,
>> 動都沒動過啊。
>> 謝謝你囉。


野人獻曝一下, 說說我的心得, 若有不對請指教
==========================================

很明顯地, 是current kernel version和kernel source version不一致所造成的.
你的current kernel version為2.4.18-6mdk, 但編譯module時, 所使用的
kernel source version卻是2.4.18.

解決的方法有幾個, 自己擇一使用:
1. 最直接的方法是將kernel source version弄成 2.4.18-6mdk.

2. 強迫載入module, 方法如下:
insmod -f my.o

但會出現警告訊息.
若kernel version和kernel source version差異不大時(如2.4.18-6mdk和2.4.18),
那麼是可以使用這個方法. 但若是差異太大時(如2.2和2.4), 那麼建議就不要這麼做.

3. Include header file 路徑指定錯誤:
或許你己經有裝了2.4.18-6mdk的kernel source, 但卻沒有使用到, 所以才會有這樣錯誤發生.
回頭看一下my.c的source code, 裡面有一列是:
#include <linux/module.h>
然而在進行編譯時, 事實上它是使用 /usr/include/linux/module.h 這個header file. 而不是
使用kernel source的header file, 因為gcc預設的include路徑為 /usr/include.
所以我們若要使用kernel source的header file來編譯module時, 就需要指定include路徑, 如下:
gcc -c my.c -I /usr/src/linux/include

你可以做個實驗, 看看下面兩種方法所編譯出來module,
在loading時會有什麼樣的error message並比較一下.
gcc -c my.c

gcc -c my.c -I /usr/src/linux/include

我們也可以使用這樣的方法來得知參與module編譯的header version是多少.

4. 修改kernel source version代號. 這個方法看起來很複雜, 其實很簡單.
首先, 先說明一下, kernel release version是由
VERSION, PATCHLEVEL, SUBLEVEL和 EXTRAVERSION所組成, 格式如下:
KERNELRELEASE=VERSION.PATCHLEVEL.SUBLEVEL+EXTRAVERSION

舉個例子,
你的current kernel version為2.4.18-6mdk, 而kernel source version是2.4.18.
依照上面的格式拆開來看為

VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION
current kernel version 2 4 18 -6mdk
kernel source version 2 4 18 (空白)

注意到了沒, 兩者只差了EXTRAVERSION不一樣而己.
OK, 請注意, 我們修改kernel source version代號這個方法只能用在只有EXTRAVERSION有差異時.
若VERSION, PATCHLEVEL, SUBLEVEL三者之一有不一致時, 就不能使用.

現在來說明如何修改version代號, 我們的目的是要將kernel source version代號從
2.4.18改成 2.4.18-6mdk, 步驟如下:
(1) make clean
(2) vi /usr/src/linux/Makefile
請仔細看一下, Makefile這個檔案的前4列就有version代號的定義,
如下(以2.4.18為例):
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 18
EXTRAVERSION =

請把它改成如下:
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 18
EXTRAVERSION = -6mdk
改完後, 存檔離開.
(3) make dep
(4) reboot


最後再重新以下面的方法來編譯my.c
gcc -c my.c -I /usr/src/linux/include
編譯後的module就可以正常的載入了.


==================================================================
當我們寫好了程式且編譯成module後, 在載入module時
會出現如下的警告訊息, 這個訊息是告訴我們"沒有授權"???
當然module還是會載入, 只是出現警告訊息難免讓人看了不舒服.
會出現這樣的訊息是因為我們沒有在我們的程式裡面做"GPL版權宣告",
所以我們只要在程式的最後面加入
MODULE_LICENSE("GPL");
這行即可

-Warning Message------------------------------------------
Warning: loading my.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module my loaded, with warnings
----------------------------------------------------------


備註:
1. insmod -- 加入module
2. rmmod -- 移除module
3. lsmod -- 顯示目前載入到kernel的module
4. printk的訊息不一定會show在console, 可用dmesg指令顯示出來.
歡迎你來到MOTO學園一起討論Debian相關問題。
在post問題前可先別忘記了以下的步驟:
1:翻一下/usr/share/doc/中是否已經有解答了?
2:閱讀一下無痛起步是否已經提到了?
3:找一下google予以解答?
4:善用學園中的"搜尋"功能,往往答案就在裡面窩。
頭像
moto
摩托學園站長
摩托學園站長
 
文章: 2808
註冊時間: 週二 9月 03, 2002 3:37 am
來自: 台北

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客