zhzh205 发表于 2009-07-24 17:43

构建CF卡Linux系统的几个常见难题

关于如何在cf卡上构建linux ,从网上可以找到很多文章,如:许德新 《嵌入式Linux在PC104平台上的构建与实现》等等。这里主要介绍我在cf卡上构建linux系统中碰到的问题和 解决方法。采用硬件是:板子是研祥 104-1621CLDN,bios是AMI的,内核2.6.28.10。采用的方法是linux from scratch(LFS)。在此过程中遇到的主要有:

一 bios的设置
      在cf卡上建立好根文件系统后,在cf卡上安装grub引导程序,然后把编译好的内核bzImage 拷贝到/boot/下,修改/boot/grub/menu.lst/。理论上来现在至少应该能够出现grub的menu画面了,可是bios自检过后出现错误:
      searching for boot record from ide-0..not found
      boot failure
      reboot and select proper boot device or insert boot media in selected boot device
      然后怀疑是grub没有装成功,就重装了grub
grub> setup (hd1)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/reiserfs_stage1_5" exists... yes
Running "embed /boot/grub/reiserfs_stage1_5 (hd1)"...19 sectors are embedded
.
succeeded
Running "install /boot/grub/stage1 (hd1) (hd1)1+19 p (hd1,0)/boot/grub/stage2
/boot/grub/menu.lst"... succeeded
Done.
问题仍然存在,说明问题在其他地方。然后进入bios进行设置,由于cf卡在linux就相当于一个ide的硬盘,所以修改ide的相关设置,发现问题在于PCI/Plug an d Play Setup选项下PCI IDE BusMaster必须设置为Disabled 才能进入grub画面。

二 启动内核的过程中出现 kernel panic -not syncing :vfs:unable to mount root fs on unknown-block(0,0)
   这个问题的本质原因是根文件系统所在的硬件的驱动程序没有编译进kernel或者在initrd.img 中也没有把硬盘或者cf卡的驱动程序作为模块加入。还有一种是在grub或者lilo的设置中 root=/dev/sd* 或者 /dev/hd* 的设置有误。这导致内核无法识别硬盘或cf卡。所以,建议在编译内核的时候特别细心,找出硬盘是属于ata的,还是pci的,或者scsi的,然后选择相应的选项。如果很难确定硬盘或cf卡的类型,则建议先全部选上,这样先保证能够进入系统,然后用dmesg | less 查看相应的硬盘或者cf卡的硬件信息,接下来再重新选择它们的驱动,把不要的去掉。

三 内核启动过程中出现很多DMA的错误信息
    我的cf是Kinston ELITE PRO CF CARD 8GB的,应该是不支持DMA模式,所以出现重复以下错误,导致启动时间变长了很多.
ide:failed opcode was :unknown
hdc:dma disabled
hdc:dma_timer_expiry: dma status (0x21)
hdc: dma timeout error

在网上google了很长时间,多数介绍使用hdparm 来启动或者关闭cf卡的DMA模式,或者是在kernel /boot/bzImage-ok1 root=/dev/hdc1 rw 中加入ide=nodma,可是这对我的cf卡并不起作用。煞费苦心后,终于在http://www.linuxquestions.org /questions/linux-kernel-70/compact-flash-dma-doesnt-work-and-i-cant-disable-it.-734489/ 这个网页上找到答案。在查看了./Documentation/kernel-parameters.txt和./Documentation/ide /ide.txt后发现 需要传递个内核的参数不是ide=nodma 而是ide_core.nodma=1.0 这里1.0指的就是我的cf卡对应的接口号和设备号。这样 kernel /boot/bzImage-ok1 root=/dev/hdc1 rw ide_core.nodma=1.0 就没有DMA的错误信息了。ide_core还有一些其他的选项,具体参阅内核的文档 ./Documentation/ide/ide.txt。

    总而言之,搞了一个多月虽然很辛苦,但也学了不少东西。总结一下就是:善于使用google的搜索可以减少找到答案的时间,而且尽量使用英文关键字,因为作技术使用英文的人毕竟比用中文的多;多查看内核自带的文档里面有很多好东西;多跟内行的人交流(逛论坛,QQ群);无论作什么事一定要逻辑清楚,有耐心。山穷水复疑无路,柳暗花明又一村。

emmoblin 发表于 2009-07-24 23:43

不错,有的问题找了好久都找不到解决方法,最后就放弃了。
看来一定得坚持到底

shengfuqiang 发表于 2012-07-04 22:24

CF卡里面直接安装 Red Hat Linux 不行吗,干嘛要自己去编译内核这些

shell_albert 发表于 2012-07-05 06:49

回复 3# shengfuqiang

啊???????啊!@@@@@@@@@@@!!!!!!!!!!
在CF卡上安装redhat???????

第一次听说啊?!

自己定制一个精小、强悍的linux不是更好吗?bootloader+kernel+filesystem+application,用十几MB的空间就能搞定的事,干嘛要用几百MB的空间去解决呢?

强烈怀疑LZ没有做过嵌入式开发的工作。


这篇文章写得不错,记得2年前,我也曾经在研华PC104的主板上在CF卡上做linux,期间也遇到了很多问题,后来也陆续陆续解决了。
支持LZ的这种共享精神!

   

shengfuqiang 发表于 2012-07-05 09:08

回复 4# shell_albert


    确实没做过,但是我们公司的Red hat linux 9确实被我们的一个嵌入式开发同事安装到了CF卡里面。她的程序就是用Linux GCC直接编译后运行。

shell_albert 发表于 2012-07-05 16:00

回复 5# shengfuqiang


    被“她”?

好猛的“她”噢。:em02: :em02:

shengfuqiang 发表于 2012-07-05 17:09

本帖最后由 shengfuqiang 于 2012-07-05 17:16 编辑

回复 6# shell_albert


    那是,确实比较猛,不过女的做这方面的确是凤毛麟角。:wink:

主要是我们的工控机还要运行WEB程序和MYSQL数据库,估计这个是需要安装完整的Linux发行版本吧,试问一下,Linux 内核支持JAVA吗?
我也弄不明白为什么她一定要在CF卡上安装完整的发行版本,你说的那种方式: bootloader+kernel+filesystem+application 。我问过她,直接被她否定了,我专业也不是嵌入式的,所以也没有多问,不过我觉得你说的有道理,干嘛非要装发行版本的,又不是做服务器。
页: [1]
查看完整版本: 构建CF卡Linux系统的几个常见难题