关于arm linux initrd boot 探讨
2012-10-15 18:20
337 查看
关于 DEV_INITRD 支持开启后,且initrd_rootfs 无/init 文件,boot fail 问题探讨,如下是部分.config配置截取:
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../rootfs_base/rootfs_base.busybox-1.19.3.gcc441.armv7"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
下面是CMDLINE,主要关注root/rootfstype 设置,其它设置有些是关于特别platform的设置参数不用care it.
CONFIG_CMDLINE="rootdelay=2 root=/dev/mmcblk0p2 init=/init cgroup_disable=memory
rootfstype=ext4 rw mem=1024M console=ttyS0,115200 androidboot.console=ttyS0 consoleblank=0 reserved_fb=1 videomode=128:128:72:50:1:0:255:0:2:0:0:0:0:0:0:49"
如按上面配置可能会导致kernal panic.
omaplfb: Device 0: PVR Device ID: 1
Waiting 2sec before mounting root device...
VFS: Cannot open root device "mmcblk0p2" or unknown-block(179,2)
Please append a correct "root=" boot option; here are the available partitions:
b300 3872256 mmcblk0 driver: mmcblk
b301 2884096 mmcblk0p1 00000000-0000-0000-0000-000000000000mmcblk0p1
b302 507904 mmcblk0p2 00000000-0000-0000-0000-000000000000mmcblk0p2
b303 393216 mmcblk0p3 00000000-0000-0000-0000-000000000000mmcblk0p3
b304 65536 mmcblk0p4 00000000-0000-0000-0000-000000000000mmcblk0p4
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<807cfffc>] (panic+0x58/0x194)
[<807cfffc>] (panic+0x58/0x194) from [<8000925c>] (mount_block_root+0x254/0x2a4)
[<8000925c>] (mount_block_root+0x254/0x2a4) from [<80009474>] (prepare_namespace+0x16c/0x1d0)
[<80009474>] (prepare_namespace+0x16c/0x1d0) from [<80008440>] (kernel_init+0x120/0x15c)
[<80008440>] (kernel_init+0x120/0x15c) from [<803b1424>] (kernel_thread_exit+0x0/0x8)
CPU0: stopping
[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<803ab2f0>] (do_IPI+0xcc/0x1a4)
[<803ab2f0>] (do_IPI+0xcc/0x1a4) from [<803b054c>] (__irq_svc+0x4c/0xe4)
Exception stack(0x80967f78 to 0x80967fc0)
7f60: 00000003 00000001
7f80: 80967fc0 00000000 80966000 803b18d8 80966000 80974bfc 0000406a 413fc090
7fa0: 00000000 00000000 00000001 80967fc0 803b18d8 80568200 60000013 ffffffff
[<803b054c>] (__irq_svc+0x4c/0xe4) from [<80568200>] (debug_smp_processor_id+0x10/0xf0)
[<80568200>] (debug_smp_processor_id+0x10/0xf0) from [<803b18d8>] (cpu_idle+0x2c/0xe4)
[<803b18d8>] (cpu_idle+0x2c/0xe4) from [<80008ba0>] (start_kernel+0x4e8/0x668)
[<80008ba0>] (start_kernel+0x4e8/0x668) from [<00008040>] (0x8040)
经过查看linux 下的init部分代码的makefile
ifneq ($(CONFIG_BLK_DEV_INITRD),y)
obj-y += noinitramfs.o
else
obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
endif
当CONFIG_BLK_DEV_INITR未定义时,链接noinitramfs.c,
static int __init default_rootfs(void)
{
int err;
err = sys_mkdir("/dev", 0755);
if (err < 0)
goto out;
err = sys_mknod((const char __user *) "/dev/console",
S_IFCHR | S_IRUSR | S_IWUSR,
new_encode_dev(MKDEV(5, 1)));
if (err < 0)
goto out;
err = sys_mkdir("/root", 0700);
if (err < 0)
goto out;
return 0;
out:
printk(KERN_WARNING "Failed to create a rootfs\n");
return err;
}
rootfs_initcall(default_rootfs);
即当系统无initrd boot时候,default rootfs 会创建/root 目录,查看mount_root()【init/do_mounts.c】函数代码,发现其需要access /root 目录,所以如果正好你定制的initrdrootfs无root 目录就会出现上面kernal panic issue,如果你正巧有root 目录,那祝贺你boot ok.
通过上面探讨,可以发现initrd作用。
1.>最小rootfs系统,当从含有initrd kernal boot,initrd mount后boot工作由 initrd rootfs 里的init脚本控制;
2.>当 initrd rootfs无init文件时,系统尝试root指示的设备,note:请确保 initrd rootfs有root目录,否则会出现上面的kernal
panic issue;
如果initrd rootfs启动,且需要其停留在initrd rootfs,请将CMDLINE中的root修改为root=/dev/ram
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="../rootfs_base/rootfs_base.busybox-1.19.3.gcc441.armv7"
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
下面是CMDLINE,主要关注root/rootfstype 设置,其它设置有些是关于特别platform的设置参数不用care it.
CONFIG_CMDLINE="rootdelay=2 root=/dev/mmcblk0p2 init=/init cgroup_disable=memory
rootfstype=ext4 rw mem=1024M console=ttyS0,115200 androidboot.console=ttyS0 consoleblank=0 reserved_fb=1 videomode=128:128:72:50:1:0:255:0:2:0:0:0:0:0:0:49"
如按上面配置可能会导致kernal panic.
omaplfb: Device 0: PVR Device ID: 1
Waiting 2sec before mounting root device...
VFS: Cannot open root device "mmcblk0p2" or unknown-block(179,2)
Please append a correct "root=" boot option; here are the available partitions:
b300 3872256 mmcblk0 driver: mmcblk
b301 2884096 mmcblk0p1 00000000-0000-0000-0000-000000000000mmcblk0p1
b302 507904 mmcblk0p2 00000000-0000-0000-0000-000000000000mmcblk0p2
b303 393216 mmcblk0p3 00000000-0000-0000-0000-000000000000mmcblk0p3
b304 65536 mmcblk0p4 00000000-0000-0000-0000-000000000000mmcblk0p4
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<807cfffc>] (panic+0x58/0x194)
[<807cfffc>] (panic+0x58/0x194) from [<8000925c>] (mount_block_root+0x254/0x2a4)
[<8000925c>] (mount_block_root+0x254/0x2a4) from [<80009474>] (prepare_namespace+0x16c/0x1d0)
[<80009474>] (prepare_namespace+0x16c/0x1d0) from [<80008440>] (kernel_init+0x120/0x15c)
[<80008440>] (kernel_init+0x120/0x15c) from [<803b1424>] (kernel_thread_exit+0x0/0x8)
CPU0: stopping
[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<803ab2f0>] (do_IPI+0xcc/0x1a4)
[<803ab2f0>] (do_IPI+0xcc/0x1a4) from [<803b054c>] (__irq_svc+0x4c/0xe4)
Exception stack(0x80967f78 to 0x80967fc0)
7f60: 00000003 00000001
7f80: 80967fc0 00000000 80966000 803b18d8 80966000 80974bfc 0000406a 413fc090
7fa0: 00000000 00000000 00000001 80967fc0 803b18d8 80568200 60000013 ffffffff
[<803b054c>] (__irq_svc+0x4c/0xe4) from [<80568200>] (debug_smp_processor_id+0x10/0xf0)
[<80568200>] (debug_smp_processor_id+0x10/0xf0) from [<803b18d8>] (cpu_idle+0x2c/0xe4)
[<803b18d8>] (cpu_idle+0x2c/0xe4) from [<80008ba0>] (start_kernel+0x4e8/0x668)
[<80008ba0>] (start_kernel+0x4e8/0x668) from [<00008040>] (0x8040)
经过查看linux 下的init部分代码的makefile
ifneq ($(CONFIG_BLK_DEV_INITRD),y)
obj-y += noinitramfs.o
else
obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o
endif
当CONFIG_BLK_DEV_INITR未定义时,链接noinitramfs.c,
static int __init default_rootfs(void)
{
int err;
err = sys_mkdir("/dev", 0755);
if (err < 0)
goto out;
err = sys_mknod((const char __user *) "/dev/console",
S_IFCHR | S_IRUSR | S_IWUSR,
new_encode_dev(MKDEV(5, 1)));
if (err < 0)
goto out;
err = sys_mkdir("/root", 0700);
if (err < 0)
goto out;
return 0;
out:
printk(KERN_WARNING "Failed to create a rootfs\n");
return err;
}
rootfs_initcall(default_rootfs);
即当系统无initrd boot时候,default rootfs 会创建/root 目录,查看mount_root()【init/do_mounts.c】函数代码,发现其需要access /root 目录,所以如果正好你定制的initrdrootfs无root 目录就会出现上面kernal panic issue,如果你正巧有root 目录,那祝贺你boot ok.
通过上面探讨,可以发现initrd作用。
1.>最小rootfs系统,当从含有initrd kernal boot,initrd mount后boot工作由 initrd rootfs 里的init脚本控制;
2.>当 initrd rootfs无init文件时,系统尝试root指示的设备,note:请确保 initrd rootfs有root目录,否则会出现上面的kernal
panic issue;
如果initrd rootfs启动,且需要其停留在initrd rootfs,请将CMDLINE中的root修改为root=/dev/ram
相关文章推荐
- U-boot-1.1.4中关于hello_world.srec出错 分类: DSP arm-linux-Ubuntu 2013-07-22 16:29 352人阅读 评论(0) 收藏
- 关于arm-linux-gcc交叉编译工具链,实现自己的crt0或者编译UBOOT出现undefined reference to `__aeabi_unwind_cpp_pr0'的解决方法
- u-boot-1.1.6及Linux-2.6.22到arm platform(s3c2440)
- arm上电死机怎么烧写boot 分类: arm-linux-Ubuntu 2013-07-22 16:31 361人阅读 评论(0) 收藏
- 关于交叉编译器arm-linux-gcc-3.3.2.tar.bz2 建立交叉编译环境
- 嵌入式学习方法 关于ARM+linux(转)
- 关于如何继续深入学习arm+linux(转)
- 关于Linux3.0驱动里面是否需要关中断的探讨
- 关于在linux下面和WIN7下面新建一个TinkPHP3.1.3和3.2.3项目--探讨
- arm-linux-gcc 移植u-boot2015.04时make menuconfig 错误
- 修改u-boot编译选项以便支持使用arm-linux-gnueabihf-编译器编译(soft-float & VFP hard)
- 笔记:linux中实现fiq模式(关于arm中断,唤醒中断)
- arch/arm/boot/compressed/vmlinux生成过程
- 常用u-boot命令详解(全) 2 分类: arm-linux-Ubuntu 2013-07-22 16:28 309人阅读 评论(0) 收藏
- u-boot 分析 - [嵌入式Linux系统开发技术详解-基于ARM]
- arm linux 启动流程之 ppcboot
- 关于arm-linux-ld命令集
- 构建 arm-linux 仿真运行环境 (skyeye + u-boot + arm-linux + NFS)
- 嵌入式ARM+Linux学习记录(3)-u-boot移植
- u-boot 分析 - [嵌入式Linux系统开发技术详解-基于ARM]