LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2292|回复: 21

helloworld的module出现问题

[复制链接]
发表于 2006-1-1 13:17:43 | 显示全部楼层 |阅读模式
我在看<linux内核驱动开发>的书,上面有一个helloworld的例子,我在debian上试了一下有问题,但是在FC1上没有问题.不知道是为什么.
代码如下:
      1 #define MODULE
      2 #include <linux/module.h>
      3
      4 int init_moudle(void)
      5 {
      6     printk("<1> Hello world\n");
      7     return 0;
      8 }
      9 void cleanup_moudle(void)
     10 {
     11     printk("<1> Bye world\n");
     12 }

编译:gcc -c hello.c
结果出错:
In file included from /usr/include/linux/sched.h:12,
                 from /usr/include/linux/module.h:10,
                 from hello.c:2:
/usr/include/linux/jiffies.h:84: error: syntax error before 'jiffies_64'
/usr/include/linux/jiffies.h:88: error: syntax error before 'get_jiffies_64'
/usr/include/linux/jiffies.h: In function 'timespec_to_jiffies':
/usr/include/linux/jiffies.h:320: error: called object 'u64' is not a function
/usr/include/linux/jiffies.h:320: error: called object 'u64' is not a function
/usr/include/linux/jiffies.h:320: error: 'NSEC_PER_SEC' undeclared (first use in this function)
/usr/include/linux/jiffies.h:320: error: (Each undeclared identifier is reported only once
/usr/include/linux/jiffies.h:320: error: for each function it appears in.)
/usr/include/linux/jiffies.h:321: error: called object 'u64' is not a function
/usr/include/linux/jiffies.h:321: error: called object 'u64' is not a function
/usr/include/linux/jiffies.h:324: error: syntax error before 'sec'
/usr/include/linux/jiffies.h:324: error: syntax error before 'NSEC_PER_SEC'
/usr/include/linux/jiffies.h:324: error: called object 'u64' is not a function
/usr/include/linux/jiffies.h:324: error: syntax error before ')' token
/usr/include/linux/jiffies.h: In function 'jiffies_to_timespec':
...............................................

下面还有很多,我就不列出来了。这是因为什么原因呢?理论上jiffies.h不应该出错啊?
 楼主| 发表于 2006-1-1 13:18:58 | 显示全部楼层
我的内核有
2.4.27-2-686-smp
2.6.8-2-686-smp

在stable和testing上试了一下都不行,不知道是什么原因
回复 支持 反对

使用道具 举报

发表于 2006-1-1 14:43:55 | 显示全部楼层
2.4 和2.6模块编译过程差别很大的
你现在用的是什么内核
看LDD的最新版
LDD3是讲2.6的
回复 支持 反对

使用道具 举报

发表于 2006-1-1 15:24:17 | 显示全部楼层
你的这种写法只适合2.4的内核。
使用uname -r看看你当前的内核版本。
ldd1是以2.2的核为基础讲的;ldd2是以2.4的核为基础讲的;只有ldd3才是针对2.6的内核的。
这儿有一篇我的学习笔记,你可以看看。
http://blog.chinaunix.net/articl ... 668&blogId=1355
我也在学内核驱动开发,有问题多交流吧。呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 15:49:27 | 显示全部楼层
我现在使用的是2.6内核。但在2.4下编译也是有同样问题。
To xqkz:
你的Makefile中为:
make -C /lib/modules/$(shell uname -r)/build/ SUBDIRS=$(PWD) modules

在我这里就是 /lib/modules/2.6.8-2-686-smp/build/,但是build这个目录我不存在,并且如果新建的话,Make时候还是出错:
make[1]: Entering directory `/lib/modules/2.6.8-2-686-smp/build'
make[1]: *** 没有规则可以创建目标“modules”。 停止。
make[1]: Leaving directory `/lib/modules/2.6.8-2-686-smp/build'
make: *** [default] 错误 2
回复 支持 反对

使用道具 举报

发表于 2006-1-1 16:06:58 | 显示全部楼层
/lib/modules/2.6.8-2-686-smp/build
这个目录一般是符号连接
指向真正放置内核源代码的目录
比如/usr/src/linux
回复 支持 反对

使用道具 举报

发表于 2006-1-1 16:18:35 | 显示全部楼层
Post by marvel
我现在使用的是2.6内核。但在2.4下编译也是有同样问题。
To xqkz:
你的Makefile中为:
make -C /lib/modules/$(shell uname -r)/build/ SUBDIRS=$(PWD) modules

在我这里就是 /lib/modules/2.6.8-2-686-smp/build/,但是build这个目录我不存在,并且如果新建的话,Make时候还是出错:
make[1]: Entering directory `/lib/modules/2.6.8-2-686-smp/build'
make[1]: *** 没有规则可以创建目标“modules”。 停止。
make[1]: Leaving directory `/lib/modules/2.6.8-2-686-smp/build'
make: *** [default] 错误 2


我装的debian,build目录是属于kernel-image-2.6.12.4-486这个包的。
build目录其实应该是一个生成你当前内核的源代码树目录。比如我自己编译了2.6.14的内核。
安装后,在/lib/modules/2.6.14中有一个build目录,直接指向了/usr/src/linux-2.6.14目录。

如果我没有猜错的话,你看的应该是《linux内核驱动开发(第二版)》也就是平时说的ldd2。
那么,你的内核编译应该是在2.4的核下面。

最直接的方法是自己编译安装2.4的内核,然后用自己编译的核启动。在那个下面编译就可以了。当然你也可以不编译2.4的核,也可以进行内核编译。可以参考我的另一篇笔记。
http://blog.chinaunix.net/articl ... 841&blogId=1355
回复 支持 反对

使用道具 举报

发表于 2006-1-1 16:20:15 | 显示全部楼层
注意,build目录是指向内核源代码的目录链接,不要自己去创建它,那是没用的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-1 17:18:29 | 显示全部楼层
哦,原来是这样子。
ldd2和ldd3我现在都在看。只不过现在连helloworld都没有运行起来,比较郁闷。
我将/lib/modules/2.6.14/module 指向了 /usr/src/linux-2.6.14
make的时候出现:
make -C /lib/modules/2.6.8-2-686-smp/build/ SUBDIRS=/home/marvel/programming/module modules
make[1]: Entering directory `/usr/src/kernel-source-2.6.8'
  CC [M]  /home/marvel/programming/module/hello.o
In file included from include/linux/init.h:4,
                 from /home/marvel/programming/module/hello.c:1:
include/linux/config.h:4:28: error: linux/autoconf.h: 没有那个文件或目录
In file included from include/linux/module.h:10,
                 from /home/marvel/programming/module/hello.c:2:
.....

我发现linux的内核源码包中没有找到 autoconf.h文件,这个文件被config.h用到。
即/usr/src/linux/include/linux/autoconf.h不存在。这个文件不是内核没有带吧?
回复 支持 反对

使用道具 举报

发表于 2006-1-1 17:33:52 | 显示全部楼层
我换我第一次给你提供的那个笔记运行吧。
当然你的写法也要变的。2.6与2.4的变化蛮大的。
你现在的写法是2.4的,所以绝对没有可能在2.6的内核环境下运行起来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表