[问题] 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