分类: 嵌入式
2011-05-05 22:12:49
Multimedia devices --->
Radio Adapters --->
< > Maestro on board radio
< > D-Link USB FM radio support (EXPERIMENTAL)
drivers/mmc/wbsd.c:2048: error: storage size of `wbsd_driver' isn't known
make[2]: *** [drivers/mmc/wbsd.o] 错误 1
make[1]: *** [drivers/mmc] 错误 2
make: *** [drivers] 错误 2
去除部分 Device Drivers --->
MMC/SD Card support --->
< > Winbond W83L51xD SD/MMC Card Interface support
编译完上述的hello版本完之后,通过ftp下载到mini2440板子上,但当插入该模块是出错了,如下:
qq2440_hello_module: version magic '2.6.13 ARMv4 gcc-3.4' should be '2.6.13 pree mpt ARMv4 gcc-3.4'
原因是:preempt ARMv4 gcc-3.4 是内核认为的当前版本,而编译出来的模块的版本是'2.6.13 ARMv4 gcc-3.4‘,这样内核和要加载的模块版本不一致,内核拒绝加载这个模块。
问题解决了,是由于在配置内核的时候没有选择preemptable这项,选上之后可以正确加载模块,即少了preempt,进行如下修改,即可:
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
[*] Select only drivers expected to compile cleanly
实际上进行上述修改之后,增加了
Loadable module support --->
[ ] Module versioning support (EXPERIMENTAL)
帮助:
Symbol: MODVERSIONS [=n]
Prompt: Module versioning support (EXPERIMENTAL)
Defined at init/Kconfig:444
Depends on: MODULES && EXPERIMENTAL Location: -> Loadable module support
-> Enable loadable module support (MODULES [=y])
也增加了:
Kernel Features --->
[*] Preemptible Kernel (EXPERIMENTAL)
在这里主要把这个选上就可以:查看vim include/linux/vermagic.h 得知
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
然后,搜索PREEMPT即可,找到[*] Preemptible Kernel (EXPERIMENTAL)选项,打开。
即MODVERSIONS配置,所以就会出现preempt 的 version magic 了。请参考另一篇文章对versino magic 的检查说明:
http://blogold.chinaunix.net/u3/118340/showart_2537265.html
[root@FriendlyARM plg]# insmod qq2440_hello_module.ko
insmod: cannot insert `qq2440_hello_module.ko': File exists (-1): File exists
[root@FriendlyARM plg]#
[root@FriendlyARM plg]# rmmod qq2440_hello_module.ko
Good-bye, QQ2440 module was removed!
[root@FriendlyARM plg]# insmod qq2440_hello_module.ko
Hello, QQ2440 module is installed !
网址:http://blog.csdn.net/linwhwylb/archive/2010/09/05/5864200.aspx
http://blogold.chinaunix.net/u2/70445/showart_1271808.html
3.稍微更改一下Makefile:
每个内核的名字都包含了他的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个和运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,假如 uname -r 返回字符串2.6.18-1.2798.fc6,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2798.fc6
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
也就是最后一个连字符后面的任何内容。
4.配置及编译内核。
进入/usr/src/2.6.18-1.2798.fc6-i586/目录下,能够看到Makefile文档,他包含了整个内核树编译信息。该文档最上面四行是关于内核版本的信息。对于整个Makefile能够不用做修改,采用默认的就能够了。
一般情况下,需要先用命令诸如"make menuconfig", "make xconfig"或"make oldcofig"对内核进行配置,这几个都是对内核进行配置的命令,只是他们运行的环境不相同,执行一下这几个命令中的任何一个即可对内核进行配置: make menuconfig是基于界面的内核配置方法,make xconfig应该是基于QT库的,更有make gcofig也是基于图像的配置方法,应该是需要GTK的环境,make oldcofig就是对内核树原有的.config文档进行配置一下即可。
其实内核的配置部分,主要是确保内核启动模块可动态加载的配置,默认配置里面应该已包含了这样的内容,因此,我用的是make menuconfig.
注意:
您的内核必须已启用这些选项进行了编译,用以支持模块的动态加载。
(用make menuconfig调出内核配置菜单):
Loadable module support --->