博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Initramfs或yaffs2作为根文件系统启动成功,但是Ramdisk作为根文件系统有问题
阅读量:4108 次
发布时间:2019-05-25

本文共 2134 字,大约阅读时间需要 7 分钟。

使用Initramfs或yaffs2作为根文件系统启动成功,但是Ramdisk作为根文件系统有问题

最近在调一个很郁闷的系统问题:
使用Ramdisk作为根文件系统时,分区结构如图
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "U-Boot",
        .size    = 0x60000,
        .offset    = 0,
    },
    [1] = {
        .name    = "Linux Kernel",
        .offset = 0x80000,
        .size    = 0x300000,
    },
    [2] = {
        .name    = "RAMDisk",
        .offset = 0x380000,
        .size    = 0x1000000,
    },
    [3] = {
        .name    = "Yaffs",
        .offset = 0x1380000,
        .size    = 0x08000000-0x1380000, //0x6C80000
    }
};
uboot启动参数:
#define CONFIG_BOOTARGS    "initrd=0x31000000,0x1000000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"  //ramdisk
#define CONFIG_BOOTCOMMAND    "nboot 30008000 0 80000;bootm 30008000"
使用
mkimage -n 'Kernel' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d linux-2.6.33.3/arch/arm/boot/zImage /var/lib/tftpboot/uImage
mkimage -n 'Ramdisk' -A arm -O linux -T ramdisk -C gzip -a 0x31000000 -e 0x31000040 -d initrd.gz ramdisk2.gz
做的image
结果只有第一次执行
tftp 0x31000000 initrd.gz
nand erase 0x380000 0x1000000
nand write 0x31000000 0x380000 0x520000
后可以正常启动,重启后就提示找不到Ramdisk了。
若把boot command设成
setenv bootcmd "nboot 30008000 0 80000; nand read 0x31000000 0x380000 0x520000; bootm 30008000 0x31000000"
则一次也不能启动成功。
刚开始怀疑是yaffs2的问题,把yaffs2给取消了,也不mount了,问题依旧。
但是若把rootfs放在yaffs2里,参数设为
setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
setenv bootcmd "nboot 30008000 0 80000;bootm 30008000"
则一切正常,但是因为会留下Flash写操作频繁的隐患。
开动FF上网,没有找到问题的解决方法,倒是找到了initramfs的制作方法。既然initramfs比ramdisk更潮,何不试试?
于是把uboot的参数设为
setenv bootargs root=/dev/ram rw init=/init console=ttySAC0 mem=64M
setenv bootcmd "nboot 30008000 0 80000;bootm 30008000"
分区表改为
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "U-Boot",
        .size    = 0x60000,
        .offset    = 0,
    },
    [1] = {
        .name    = "Linux Kernel",
        .offset = 0x80000,
        .size    = 0x1300000,
    },
    [2] = {
        .name    = "Yaffs",
        .offset = 0x1380000,
        .size    = 0x08000000-0x1380000, //0x6C80000
    }
};
重新做了个将近11M的内核,
tftp 0x30008000 uImage
nand erase 0x80000 0xC00000
nand write 0x30008000 0x80000 0xB20000
重启一切正常。看来tmpfs还是很有优势的,至少问题没有Ramdisk那么多,那么繁琐,制作系统也灰常简单。
问题是:Ramdisk作为rootfs时,为什么重启后内核找不到rootfs呢? 还是没搞懂。

转载地址:http://bhpsi.baihongyu.com/

你可能感兴趣的文章
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
fastcgi_param 详解
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
DirectX11 三种光照组成对比
查看>>
DirectX11 指定材质
查看>>
DirectX11 点光
查看>>