Chinaunix首页 | 论坛 | 博客
  • 博客访问: 351694
  • 博文数量: 82
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 19:13
文章分类

全部博文(82)

文章存档

2015年(1)

2014年(1)

2013年(1)

2012年(12)

2011年(3)

2010年(25)

2009年(37)

2008年(2)

我的朋友

分类: LINUX

2009-06-30 17:26:33

     在编译驱动过程中出现的问题主要有两个,最首先的就是编译内核模块(网卡驱动)时所缺的内核源码树,因为用的是fedora core 9,本身不带内核源码的,所以一开始就出错,于是先重新编译内核树。
在里下载了kernel-2.6.27.25-78.2.56.fc9.src.rpm,放到/usr/src中
首先安装,#rpm  -ivh kernel-2.6.27.25-78.2.56.fc9.src.rpm
在/usr/src/redhat/SPECS中会生成kernel.spec,进入到该文件夹,运行
#rpmbuild  -bp --target i686  kernel.spec
在/usr/src/redhat/BUILD中会产生内核源码,进入内核源码文件夹,运行
#make
#make install
一般不会出错,系统多了一个内核镜像

这个问题解决了,第二个问题也就来了:
    在用Asus自带的驱动编译时,怎么多通不过,后来在网上找了一个比较新的驱动源码(rt73),按照readme中的,编译顺利通过,但是在最后装载模块时,即执行#insmod  rt73.ko时,产生如下错误:
Jun 30 03:15:53 localhost kernel: rt73: version magic '2.6.27.25-78.2.56.fc9.i686.debug SMP mod_unload 686 4KSTACKS ' should be '2.6.27.25 SMP mod_unload 686 4KSTACKS '
在网上查找后,原来是版本有问题,具体描述如下:
    Linux内核一直在更新、完善,在a版本内核源码下编译的模块在b版本内核下通常不能运行,所以必须有一种机制,限制在a版本内核下编译生成的模块在b版本内核下被加载。
    2.4与2.6内核在可装载内核模块的版本检查机制方面发生了根本性的改变,不过这些改变对设备驱动开发人员而言基本是透明的。为了使模块装载时的版本检查机制生效,2.4 内核下,只需在CFLAGS中定义

-DMODVERSIONS -include $(KDIR)/include/linux/modversions.h;

2.6内核下,开发人员无须采用任何操作。

不过,在此仍有必要阐明2.4与2.6内核对可加载模块的版本检查机制。

2.4内核下, 执行`cat /proc/ksyms`可看到内核符号在名字后还跟随着一串校验字符串,此校验字符串与内核版本有关。在内核源码头文件linux/modules 目录下存在许多*.ver文件,这些文件起着为内核符号添加校验后缀的作用,如ksyms.ver 文件里有一行 #define printk _set_ver(printk)。linux/modversions.h 文件会包含全部的 ver文件。所以当模块包含linux/modversions.h文件后,编译时,模块里使用的内核符号实质是带有校验后缀的内核符号。在加载模块时,如果模块中所使用内核符号的校验字符串与当前运行内核所导出的相应的内核符号的校验字符串不一致,即当前内核空间并不存在模块所使用的内核符号,就会出现"Invalid module format "的错误。
    为内核符号添加校验字符串来验证模块的版本与内核的版本是否匹配是繁杂和浪费内核空间的;而且随着SMP(对称多处理器)、PREEMPT(可抢占内核)等机制在2.6内核的引入和完善,模块运行时对内核的依赖不仅取决于内核版本,还取决于内核的配置,此时内核符号的校验码是否一致不能成为判断模块可否被加载的充分条件。2.6 内核下,在linux/vermagic.h中定义有VERMAGIC_STRING,VERMAGIC_STRING不仅包含内核版本号,还包含有内核使用的gcc版本,SMP与PREEMPT等配置信息。模块在编译时,我们可以看到屏幕上会显示"MODPOST"。在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts\mod\modpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过`modinfo mymodule.ko`命令可以查看此模块的vermagic等信息。2.6 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的 vermagic信息是否一致,两者一致时,模块才能被装载。譬如Fedora core 4 与core 2 使用的都是2.6 版本内核,在Fedore Core 2下去加载Fedora Core4下编译生成的hello.ko,会出现"invalid module format" 错误。

后来就跑到ubuntu中编译,最后通过了
http://www.ibm.com/developerworks/cn/linux/l-module26/

阅读(2016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~