Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489854
  • 博文数量: 115
  • 博客积分: 5016
  • 博客等级: 大校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 16:03
文章分类

全部博文(115)

文章存档

2013年(1)

2010年(17)

2009年(76)

2008年(21)

我的朋友

分类: LINUX

2010-04-25 16:17:31

也许是快要毕业了的缘故吧,最近这段时间一直比较散漫,前些日子也一直玩了,只是零零散散的读了点litmus的源代码,毕设的东西一直没有什么进展,懒到连实验环境都没有去搭建。周一得知老大周五就要回来了,忽然紧张了起来,呵呵,毕竟他走了一个月,我总不能拿豪无进展去交代吧!就开始疯狂的想idea,去做实现。这时候我才真正的意识到什么叫没有压力就没有动力,前些日子一直头痛于litmus的源代码,每天看不到十分钟就像去玩会儿,可是现在感觉完全不同了,几万行代码两天完全搞定,还感觉框架非常清晰,仔细总结了一下之后就开始想自己的实现,首先选择了一个比较简单的策略和算法,周三设计了一下数据结构和算法框架,接下来就开始疯狂编码,两天时间,写了900多行代码,功能框架基本上实现了,然后就是调试,看着它在内核编译时一个个错误跳出,真有些闹心,但是调试的过程其实更是享受的过程,当你克服了一个个困难,看到自己编写的代码通过make时真的很有成就感,忽然间有一种想法──自己的技术似乎还不错,去移动是不是浪费了……!呵呵,yy一下。继续说遇到的问题。与调度相关的就不说了,几个通用而常见的错误纪录下来,希望大家以后要是遇到少走一些弯路。
(1)内核的x86版本不支持浮点数或者说对浮点数的支持不好,我在表示cpu的utilization时使用了double类型,结果编译时总是出现各种库找不到的问题,这个问题我也不是太懂,查阅了很多资料,未果,最后还是改变了自己的实现策略,用了一个比较幼稚的办法,把utilization乘上1000用int来表示.
下面这两个问题是后来我把实验环境从虚拟机弄到硬盘机上遇到的(虚拟机实在是太慢了……):
(2)错误:undefined reference to '__umoddi3' ‘__udivdi3’等等 查阅了一下资料,是gcc版本太新的缘故,新的内核支持了gcc-4.3 肯定就没问题了,解决办法有两个,那就是用 低版本的gcc,第二种就是修改Makefile,我采用了第二个,也就导致了第三个错误的产生。
 将KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common
改为:KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common \
                   -fno-tree-scev-cprop
然后再make就不会有错了~
(3)在执行make modules时,到了Building modules,Stage 2后出错,具体错误:
: WARNING: "_proxy_pda" [fs/lockd/lockd.ko] undefined!
: WARNING: "_proxy_pda" [drivers/net/irda/toim3232-sir.ko] undefined!
: WARNING: "_proxy_pda" [drivers/media/video/saa5249.ko] undefined!
: WARNING: "_proxy_pda" [drivers/infiniband/core/ib_uverbs.ko] undefined!
: make[1]: *** [__modpost] Error 1
: make: *** [modules] Error 2
这个错误更让我摸不着头脑了,google了很长时间,没有找到办法,后来想了想我在虚拟机中用F8并没有出现
这个问题,估计是和环境有关系,于是我查看了一下F8的gcc版本,4.1,而我的是4.3.2.只能试一试用低版本
gcc了,安装了gcc-4.1,然后修改了一下MAkefile,将里面的HOSTCC和CC指定为gcc-4.1,重新编译,
结果出现了
-fno-tree-scev-cprop不能识别的错误这个是在(2)添加上的,所以直接删去就好了,继续,OK!
(4)内核编译过程中的initrd.img文件不会自动生成,需要使用mkinitramfs来生成:

mkinitramfs /lib/modules/新内核版本  -o  /boot/initrd.img-新内核号”制作
inird  /boot/initrd.img-新内核号
(5)手动修改grub的menu.lst文件
阅读(1071) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~