[問題] kernel module compile

看板LinuxDev作者 (.)時間11年前 (2013/10/30 19:41), 編輯推噓1(107)
留言8則, 3人參與, 最新討論串1/2 (看更多)
環境是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目錄不是嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 172.249.127.149

10/30 22:43, , 1F
這google的到吧,LDD上的source code是2.6.xx,你要找對
10/30 22:43, 1F

10/30 22:43, , 2F
應的版本才有這個config.h
10/30 22:43, 2F

10/30 22:44, , 3F
3.x太新了,所以你看LDD時要找舊一點的kernel來玩
10/30 22:44, 3F

10/31 01:14, , 4F
Yes, but I would like to know there is any replacement
10/31 01:14, 4F

10/31 01:16, , 5F
for config.h in 3.5 kernel. Maybe Linux moves it to
10/31 01:16, 5F

10/31 01:16, , 6F
Some other folder? Or it is obsolete?
10/31 01:16, 6F

11/02 13:03, , 7F
kernel在/boot 下面呀
11/02 13:03, 7F

11/02 13:05, , 8F
主要的kernel elf檔在/boot 下面
11/02 13:05, 8F
文章代碼(AID): #1ISF26UC (LinuxDev)
討論串 (同標題文章)
文章代碼(AID): #1ISF26UC (LinuxDev)