[問題] kernel module compile

作者: sean72 (.)   2013-10-30 19:41:54
環境是Ubuntu 12.04
Linux 3.5.0.42
按照Linux Device Driver 這本書
http://www.makelinux.net/ldd3/?u=chp-2-sect-2
寫了簡單的helloWorld module
裡面寫到make指令這樣下
make -C ~/kernel-2.6 M=`pwd` modules
-c 的參數是kernel的位置
而kernel應該是放在/usr/src/linux-2.6.10
但是我在我的ubuntu裡面
/usr/src/資料夾中 只看到下面這些header檔
linux-headers-3.2.0-23
linux-headers-3.5.0-37
linux-headers-3.5.0-23
linux-headers-3.5.0-37-generic
linux-headers-3.5.0-23-generic
linux-headers-3.5.0-42
linux-headers-3.5.0-34
linux-headers-3.5.0-42-generic
linux-headers-3.5.0-34-generic
linux-source-3.2.0
linux-headers-3.5.0-36
linux-headers-3.5.0-36-generic
我心中有疑惑,但仍嘗試編譯而出現如下錯誤
(為什麼我的ubuntu裡面只有header? 那我的kernel去哪了?)
make -C /usr/src/linux-headers-3.5.0-42-generic/include
M=/home/shsu/helloWorld modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-42-generic/include'
make[1]: *** No rule to make target `modules'. Stop.
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-42-generic/include'
make: *** [all] Error 2
接著一番估狗之後,發現tldp的教學文章
http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
我按照裡面所說
將-c的路徑設定為/lib/modules/3.5.0-42-generic
編譯成功! 並且可以成功載入module
所以說,我的linux kerenel實際上放在/lib/modules/這個資料夾下面嗎?
但是資料夾名稱聽起來又怪怪的?
上面的聯結又提到一個簡單的控制鍵盤led範例
10.2. Flashing keyboard LEDs
裡面引用了
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <linux/console_struct.h>
裡面所有的include我都可以在
/lib/modules/3.5.0-42-generic/build/include中找到
唯獨config.h這個檔案找不到
編譯的時候出現下面這個錯誤
fatal error: linux/config.h: No such file or directory
我估狗了一下 發現2.6以前是有這個linux/config.h
但是2.6之後改成autoconf.h
但我在/lib/modules/3.5.0-42-generic/build/include中卻找不到
又找到一個解法是在source code裡面將其改為
#include “/lib/modules/3.5.0-42-generic/build/include/generated/autoconf.h”
但是這樣編譯的結果卻是source code裡面一堆東西找不到,
看來這也不是正確的config檔案
可否請版友幫忙解疑,我該去哪邊include 這個config.h?
最後一個問題,關於路徑
我在/lib/modules/3.5.0-42-generic/build/include/linux都能手動找到我需要的.h檔
我寫make –c /lib/modules/3.5.0-42-generic/build/
那麼為何我在source code的地方是寫
#include <linux/module.h>
而不是
#include <include/linux/module.h>
/lib/modules/3.5.0-42-generic/build/和 …../linux/module.h
中間差了一層/include目錄不是嗎?
謝謝
作者: cobrasgo (人魚線變成鮪魚線,超帥)   0000-00-00 00:00:00
這google的到吧,LDD上的source code是2.6.xx,你要找對應的版本才有這個config.h3.x太新了,所以你看LDD時要找舊一點的kernel來玩
作者: sean72 (.)   0000-00-00 00:00:00
Yes, but I would like to know there is any replacementfor config.h in 3.5 kernel. Maybe Linux moves it toSome other folder? Or it is obsolete?
作者: mshockwave (夏克維夫)   2012-01-02 13:03:00
kernel在/boot 下面呀主要的kernel elf檔在/boot 下面

Links booklink

Contact Us: admin [ a t ] ucptt.com