Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21057
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-15 12:42
文章分类
文章存档

2013年(4)

我的朋友

分类: LINUX

2013-07-25 10:29:18

1. 根文件系统不能加载

VFS: Cannot open root device "bon/3" or unknown-block(2,0)

Please append a correct "root=" boot option

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

注意两点:

1)vivi 中的linux_cmd[]是否正确;

原来的是:noinitrd root=/dev/bon/3 init=/linuxrc console=tty0

要改为: noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

/dev/mtdblock3 代表flash分区的第四个分区

ttySAC0 代表第一个串口

 

在linux2.6里面用udev来管理设备文件,udev需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间,也就是说,在上电之前系统上是没有足够的设备文件可用的,我们需要一些技巧让kernel先引导 起来。 由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock 这个设备目录是不存在的,我们无法让kernel通过/dev/mtdblock/X这样的设备找到rootfs,这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel 的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。 另外一种方法就是给kernel传递未经归类的设备文件名,在udev未创建之前,所有的设备实际上已经通过sysfs 建立,mtdblockX的位置相对于/sys/block/mtdblockX/dev,这个文件里存放着mtdblockX的设备号,形式与上一种方式相同。这时由于没有相应的udev规则,所有的设备都被隐含地映射到/dev目录下,mtdblockX对应于/dev/mtdbockX,这样我们给kernel传递root=/dev/mtdblock3,kernel发现/dev没有被建立,就自动从映射表里查找对应关系,最后取出/sys/block/mtdblockX/dev里的设备号,完成rootfs的挂载。

2)内核的MTD分区是否有效

下面信息说明MTD分区没有生效:

Creating 8 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00004000 : "Boot Agent"

0x00000000-0x00200000 : "S3C2410 flash partition 1"

0x00400000-0x00800000 : "S3C2410 flash partition 2"

0x00800000-0x00a00000 : "S3C2410 flash partition 3"

0x00a00000-0x00e00000 : "S3C2410 flash partition 4"

0x00e00000-0x01800000 : "S3C2410 flash partition 5"

0x01800000-0x03000000 : "S3C2410 flash partition 6"

0x03000000-0x04000000 : "S3C2410 flash partition 7"

 

下面的信息是正确的,与flash分区的信息是一致的

Creating 5 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00020000 : "vivi"

0x00020000-0x00030000 : "param"

0x00030000-0x00300000 : "kernel"

0x00300000-0x00600000 : "root"

0x00600000-0x04000000 : "jffs2"

 

对于2.6 内核的MTD分区信息的修改方法一般有两种,内核编译部分列出的是其中的一种,还有一种在下面给出,我先使用的是下面的方法,MTD分区没有成功,可能是内核版本太高,下面的这种方法应该在2.6.10以下版本上可以(没试过)。

 

1)修改arch/arm/mach-s3c2410/devs.c文件
添加如下内容:

点击(此处)折叠或打开

  1. /*----------------------for NAND Flash---------------*/
  2. #include <linux/mtd/partitions.h>
  3. #include <linux/mtd/mtd.h>
  4. #include <asm/arch/nand.h>

  5. /*-------------------------------------------*/ 
  6. /*NAND Controller*/
  7. /*建立flash分区表*/ 
  8. /*--------------------------for partitions---------*/
  9. static struct mtd_partition partition_info[]={
  10. {/*128k*/ 
  11.     name:"vivi"
  12.     size:0x00020000, 
  13.     offset:0x00000000     
  14. },{/*64k*/ 
  15.     name:"param"
  16.     size:0x00010000, 
  17.     offset:0x00020000 
  18. },{/*2m+832k*/ 
  19.     name:"kernel"
  20.     size:0x002d0000, 
  21.     offset:0x00030000 
  22. },{/*3m*/     
  23.     name:"root"
  24.     size:0x0030000, 
  25.     offset:0x00300000 
  26. },{/*58*/ 
  27.     name:"user"
  28.     size:0x03D00000, 
  29.     offset:0x00600000 
  30. }; 
  31. /*加入NAND FLASH 分区*/ 
  32. static struct s3c2410_nand_set nandset = { 
  33.                                             nr_partitions:5, /*the number of partition*/ 
  34.                                             partitions:partition_info, 
  35.                                          }; 
  36. /*建立芯片支持*/ 
  37. static struct s3c2410_platform_nand superlpplatform = { 
  38.     tacls:0, 
  39.     twrph0:30, 
  40.     twrph1:0, 
  41.     sets:&nandset, 
  42.     nr_sets:1, 
  43. }; 
  44. static struct resource s3c_nand_resource[] = { 
  45. [0] = { 
  46.     .start = S3C2410_PA_NAND, 
  47.     .end = S3C2410_PA_NAND + S3C24XX_SZ_NAND - 1, 
  48.     .flags = IORESOURCE_MEM, 
  49. }; 
  50. /*-----加入芯片支持到nand flash驱动----------*/ 
  51. struct platform_device s3c_device_nand = { 
  52.     .name = "s3c2410-nand"
  53.     .id = -1, 
  54.     .num_resources = ARRAY_SIZE(s3c_nand_resource), 
  55.     .resource = s3c_nand_resource, 
  56.     /*------------------------for MTD partitions------------------*/ 
  57.     .dev = { 
  58.     .platform_data = &superlpplatform 
  59.     } 
  60.     /*------------------------------------------------------------*/ 
  61. }; 




2)修改arch/arm/mach-s3c2410/mach-smdk2410.c
指定启动时初始化分区,使上面的修改生效。找到*smdk2410_devices[]__initdata

点击(此处)折叠或打开

  1. Static struct platform_device *smdk2410_devices[]__initdata ={
  2. ……. 
  3. ……. 
  4. &s3c_device_iis, 
  5. /*添加如下语句*/ 
  6. &s3c_device_nand, 

 


2.设备文件系统

在内核文件中增加了devfs的配置,方法如下

#vi fs/ Kconfig
找到menu “Pseudo filesystem”
在其中添加:

点击(此处)折叠或打开

  1. config DEVFS_FS
  2. bool “/dev file system support (OBSOLETE)
  3. default y
  4.    config DEVFS_MOUNT
  5. bool “Automatically mount at boot”
  6. default y
  7. depends on DEVFS_FS

编译、烧写内核,启动后dev下并没有自动建立相关的设备文件节点。查看内核源码,发现fs目录下已经没有devfs这个目录,而在2.4版本的fs目录里有这个文件夹。应该是devfs在我用的内核版本里已经去除了吧,在Linux2.6里已经用udev代替devfs了。查找相关资料,解决这个问题有两个方法:一、移植udev 二、直接用busybox提供的版的udev工具——mdev。Busybox较高版本里面已经提供的这个工具使用方法参考busybox相关说明。为了简单我直接用了mdev这个工具。需要注意的是mdev需要tmpfs和sysfs的支持,将tmpfs挂载到dev目录,mdev要对这个目录读写。sysfs挂载到sys目录。

用mdev管理设备文件虽然设备文件节点建立成功了,但好像太多了,设备节点从ram0到ram15 ,tty很多的节点,有几十个。mdev 还需要进行配置才能更好的工作,这一步我没有做。

3.Flash分区的第五个分区无法挂载

Flash分区的第五个分区一般是用来放应用程序的,并且要把他挂载到mnt/yaffs目录。

我用mount命令挂载没有成功。原因现在也没有找出来。

 

4.Framebuffer问题

   开发板上启动内核是LCD上左上叫没有小企鹅图标,但是在dev下有fb这个设备节点。同样版本的内核在PC机上编译安装后,用vag参数开启Framebuffer启动时可以看到企鹅图标。这个问题也没有解决。

(victor_tlh)

文章转自:罗索实验室 []
阅读(907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~