module奇怪错误问题集

我的机器是单CPU的,首先声明。
在编译一个模块时,如下:
#ifndef __KERNEL__
#  define __KERNEL__
#endif
#ifndef MODULE
#  define MODULE
#endif

#include <linux/config.h>
#include <linux/module.h>

#include <linux/sched.h>
#include <linux/kernel.h> /* printk() */
#include <linux/fs.h>     /* everything... */
#include <linux/proc_fs.h>
#include <linux/errno.h>  /* error codes */
#include <linux/types.h>  /* size_t */

#ifdef CONFIG_SMP
#       error "smp not support"
#endif

.........
.........

在上面的模块编译时,提示"smp not support".
gcc -c -I/usr/src/linux-2.4.18 my_module.c

但是我在kernel tree中并没有能够找到CONFIG_SMP的
定义,当然包括.config等文件中CONFIG_SMP也并没有
set.因此我就有疑问:到底这个CONFIG_SMP的宏在哪儿
被定义的??如果将
#ifdef CONFIG_SMP
#       error "smp not support"
#endif
放到所有的#include的前面,则CONFIG_SMP并没有defined
这也就是说这个CONFIG_SMP是在哪个头文件中被定义了。我用
排除法发现好像sched.h这个头文件有问题。但是sched.h
中又包含了其它许多的头文件,所以无法知道结果。

如果在每个#include的后一行都加上
#undef CONFIG_SMP
则编译通过。并且插入模块正确。

我的问题是2.4.18 source tree中根本没有CONFIG_SMP这个宏的定义
只有使用。那么其定义来自何处??因为我并没有定义!

求救!3x!
--
※ 来源:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 218.2.150.113]



--------------------------------------------------------------------------------
[本篇全文] [回复本文] [本篇作者: njuwlj] [本篇人气: 14]
发信人: njuwlj (hanwoody), 信区: LinuxUnix
标  题: Re: QUESTION ABOUT CONFIG_SMP IN MODULE
发信站: 南京大学小百合站 (Tue Mar  9 10:41:42 2004)

发现同样的问题在2.2和2.6系列中都一样。而且都是sched.h
引起的问题。如果这个问题不能解决则会发生如下问题:
for example in <asm/system.h>
有关cli()等中断的宏定义,因为smp和单cpu是不同的,其中:
#ifdef CONFIG_SMP
#define cli() __global_cli()
#else
#define cli() __cli()
#endif

由于内核莫名其妙地在sched.h中使CONFIG_SMP定义,使得
编译的模块去找__global_cli(),但是在单cpu中是没有的,
所以在插入模块时肯定出现:
unresolved symbol __global_cli
这是因为单CPU内核中并没有它,而且在ksyms中也不可能有的。


--
※ 来源:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 218.2.150.113]



--------------------------------------------------------------------------------
[本篇全文] [回复本文] [本篇作者: njuwlj] [本篇人气: 2]
发信人: njuwlj (hanwoody), 信区: LinuxUnix
标  题: Re: QUESTION ABOUT CONFIG_SMP IN MODULE
发信站: 南京大学小百合站 (Tue Mar  9 13:17:03 2004)

终于找到了问题所在,这个问题可以说是非常奇怪,因此我写得详细
一点,如果有人碰到同样的问题的话,嘿嘿。

1.当我们用make menuconfig来产生.config文件时,另外还做了很多事:
如创建了<linux/autoconfig.h> <linux/version.h>等等文件。而其中
autoconfig.h这个文件是非常重要的,不要轻易用make mrproper.

2.在/usr/include/linux/autoconfig.h中,各种发行版本包括debian(lfs
不会有这种问题)都有这么一句:
#define CONFIG_SMP 1
但是 /usr/include/linux这个目录应该是从/usr/src/linux/include/linux
直接拷贝过去的,但我们一般在单cpu下编译内核是关掉了smp,所以在内核的
linux/autoconfig.h文件中有这么一句
#undef CONFIG_SMP
但由于各个发行版中的/usr/include/linux都已经预定好了,并不是你自己
做的。

3.如果你的内核太干净,没有autoconfig.h文件,则这时会发生令人意想不到
的问题:你在写内核模块后编译,gcc编译器会到/usr/include/linux/目录下
去找autoconfig.h,即使你用了 -I/usr/src/linux/include这个CFLAGS.
而由于该目录是发行商定制的,所以有问题。这就是为什么
明明在kernel source tree中并没有#define CONFIG_SMP,但在测试中却发现
CONFIG_SMP这个宏被定义的原因。因为它在/usr/include/linux下被定义了。

经验小结:

1。内核不能太干净,不可相信出问题用make dist-clean,make mrproper之类
2。/usr/include/linux目录最好从/usr/src/linux/include/linux拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值