关于Linux2.6.30.4移植YAFFS2文件系统中出现的问题:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux2.6.30.4移植YAFFS2文件系统中出现的问题:相关的知识,希望对你有一定的参考价值。
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs: auto selecting yaffs2
block 318 is bad
block 1196 is bad
block 2010 is bad
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 176K
Kernel panic - not syncing: Attempted to kill init!
Backtrace:
[<c0038fd4>] (dump_backtrace+0x0/0x10c) from [<c027d7e8>] (dump_stack+0x18/0x1c)
r7:c381a000 r6:c0377600 r5:00000004 r4:00000004
[<c027d7d0>] (dump_stack+0x0/0x1c) from [<c027d838>] (panic+0x4c/0x124)
[<c027d7ec>] (panic+0x0/0x124) from [<c004a450>] (do_exit+0x520/0x620)
r3:c0356758 r2:c381de10 r1:c381dce4 r0:c0306e54
[<c0049f30>] (do_exit+0x0/0x620) from [<c004a594>] (do_group_exit+0x44/0xc4)
[<c004a550>] (do_group_exit+0x0/0xc4) from [<c0054a4c>] (get_signal_to_deliver+0
x198/0x350)
r5:00000004 r4:c381c000
[<c00548b4>] (get_signal_to_deliver+0x0/0x350) from [<c0037788>] (do_signal+0x5c
/0x4b0)
[<c003772c>] (do_signal+0x0/0x4b0) from [<c0037c0c>] (do_notify_resume+0x30/0x34
)
[<c0037bdc>] (do_notify_resume+0x0/0x34) from [<c0034eac>] (work_pending+0x1c/0x
20)
编译内核的时候老是出现这样的提示,在网上找了好长时间也没有结果
出现这种问题只根据你的这些也说不清什么原因。最好再仔细按照标准的步骤重新配置编译内核。 参考技术B 你是否用mkyaffs2image制作的根文件系统?
give me five
刚刚解决这个问题
共享一下:
先挂载NFS,把你要放根文件的分区挂载到 /mnt
mount -t yaffs2 /dev/mtdblock2 /mnt
然后把你的yaffs2根文件打包(如xxx.tgz)到你的Nfs根目录下。
最后进mnt,解压该包。
cd /mnt
tar xzf xxx.tgz
要特别注意的是,解压后最后你的yaffs2根文件下的内容要直接出现在/mnt下
也就是/dev/mtdblock2
hope this help 参考技术C Kernel panic - not syncing: Attempted to kill init!
看来还是 init 进程的问题。你先用个 ext2 分区启动一下试试。是不是你的 yaffs 分区的数据有问题? 参考技术D 我是出现这样的问题
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 120K
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
求分析分析
uboot在s3c2440上的移植
一、移植环境
- 主 机:VMWare--Fedora 9
- 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4
- 编译器:arm-linux-gcc-4.3.2.tgz
- u-boot:u-boot-2009.08.tar.bz2
二、移植步骤
|
好了,在了解Nand Flash组成和Yaffs/yaffs2文件系统结构后,我们再回到u-boot中。目前,在u-boot中已经有对Cramfs、Jffs2等文件系统的读写支持,但与带有数据校验等功能的OOB区的Yaffs/Yaffs2文件系统相比,他们是将所有文件数据简单的以线性表形式组织的。所以,我们只要在此基础上通过修改u-boot的Nand Flash读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs/Yaffs2文件系统的读写支持。
|
|
②、在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下:
接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:
if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) if (argc < 4) addr = (ulong)simple_strtoul(argv[2], NULL, 16); read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */ s = strchr(cmd, ‘.‘); //添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数 #if defined(CONFIG_MTD_NAND_YAFFS2) else if (!strcmp(s, ".oob")) if (read) printf(" %zu bytes %s: %s\n", size, read ? "read" : "written", ret ? "ERROR" : "OK"); return ret == 0 ? 0 : 1; |
③、在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下:
|
|
④、在第二步关联的nand_write_skip_bad函数中添加对Nand OOB的相关操作,如下:
|
int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer) #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if (((*length)%(nand->oobsize+nand->writesize)) != 0) datapages = *length/(datasize+oobsize); /* Reject writes, which are not page aligned */ len_incl_bad = get_len_incl_bad (nand, offset, *length); if ((offset + len_incl_bad) >= nand->size) { #if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support return rval; while (left_to_write > 0) { WATCHDOG_RESET (); if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if (left_to_write < (nand->erasesize - block_offset)) printf("\rWriting at 0x%llx -- ",offset); //add yaffs2 file system support
left_to_write -= write_size; #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support } return 0; |
⑤、在第四步nand_write_skip_bad函数中我们看到又对nand_write函数进行了访问,所以这一步是到nand_write函数中添加对yaffs2的支持,如下:
|
|
OK,对yaffs2支持的代码已修改完毕,重新编译u-boot并下载到nand中,启动开发板,在u-boot的命令行输入:nand help查看nand的命令,可以看到多了一个nand write[.yaffs2]的命令,这个就是用来下载yaffs2文件系统到nand中的命令了。
⑥、使用nand write[.yaffs2]命令把事前制作好的yaffs2文件系统下载到Nand Flash中(yaffs2文件系统的制作请参考:Linux-2.6.30.4在2440上的移植之文件系统),下载操作步骤和效果图如下:
⑦、结合u-boot和内核来测试启动下载的yaffs2文件系统
设置u-boot启动参数bootargs,注意:这一长串参数要与内核配置里面的Boot options-->Default kernel command string的设置要一致。特别是mtdblock3要根据内核具体的分区来设,在上一篇中讲到了内核中Nand的分区情况,u-boot属于mtdblock0,param属于mtdblock1,kernel属于mtdblock2,root就属于mtdblock3,所以这里要设置成root=/dev/mtdblock3,否则文件系统无法启动成功,会出现一些什么I/O之类的错误
好了,最后重启开发板,内核引导成功,yaffs2文件系统也挂载成功,效果图如下:
|
|
U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand, //注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
|
以上是关于关于Linux2.6.30.4移植YAFFS2文件系统中出现的问题:的主要内容,如果未能解决你的问题,请参考以下文章
[讨论]关于使用EXT2,EXT4文件系统,为啥没有用yaffs2
最新QT4.8+kernel_3.2.5+uboot_2010.06+tslib移植成功-问题小结