This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【求助】有关DM368的RAMDISK问题



各位专家好,

问题描述:我在使用DM368的DVSDK包的filesystem制作ramdisk时遇到问题,描述如下,请知道的大侠们帮忙看下。比较着急。非常感谢

我们制作ramdisk.img

(1)采用的是:arago-base-tisdk-image-dm368-evm.tar.gz

原因是这个比较小。没有采用另外一个dvsdk-dm368-evm-rootfs.tar.gz,觉得太大了。

(2)解压arago-base-tisdk-image-dm368-evm.tar.gz后得到rootfs目录。

(3)然后,在当前目录手动建立linuxrc指向busybox。

(4)然后,制作ramdisk.img

以下两种方法都试过,但是提示的错误都一样。

bash# find . | cpio -c -o > ../initrd.img
bash# gzip ../initrd.img
mkimage -n "My Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.img
或者:
bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
bash# mkfs.ext2 -F -m0 –N 8192../initrd.img
bash# mount -t ext2 -o loop ../initrd.img  /mnt
bash# cp -r  * /mnt
bash# umount /mnt
bash# gzip -9 ../initrd.img
mkimage -n "My Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.img

这两个都能得到ramdisk.img。大小约为:5.6MB,两个工具制作的ramdisk大小稍微有点差别。

(5)在uboot下启动内核:

bootm 0x84000000 0x86000000
时都会提示错误如下:
No filesystem could mount root, tried:  ext3 ext2 cramfs vfat msdos
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
Backtrace:
[<c00285f4>] (dump_backtrace+0x0/0x114) from [<c0280200>] (dump_stack+0x18/0x1c)
 r7:00008000 r6:c2011000 r5:c0021808 r4:c03689b0
[<c02801e8>] (dump_stack+0x0/0x1c) from [<c0280258>] (panic+0x54/0x12c)
[<c0280204>] (panic+0x0/0x12c) from [<c0008f80>] (mount_block_root+0x264/0x2b4)
 r3:00000000 r2:00000020 r1:c2027f60 r0:c02f2cd6
[<c0008d1c>] (mount_block_root+0x0/0x2b4) from [<c0009024>] (mount_root+0x54/0x)
 r8:00000000 r7:00000000 r6:00000000 r5:c02f2bef r4:00100000
[<c0008fd0>] (mount_root+0x0/0x6c) from [<c00091ac>] (prepare_namespace+0x170/0)
 r5:c0021808 r4:c03684c0
[<c000903c>] (prepare_namespace+0x0/0x1c8) from [<c00084bc>] (kernel_init+0xe4/)
 r5:00000000 r4:c0368280
[<c00083d8>] (kernel_init+0x0/0x118) from [<c003cd00>] (do_exit+0x0/0x668)
 r5:00000000 r4:00000000
davinci_interrupt 368: VBUS error workaround (delay coming)
davinci_interrupt 368: VBUS error workaround (delay coming)
davinci_interrupt 368: VBUS error workaround (delay coming)

而且,解压是正确的,uImage和ramdisk都类似下面的信息:

## Booting kernel from Legacy Image at 87000000 ...
   Image Name:   Linux-2.6.32.17-davinci1
   Created:      2015-12-10  14:46:33 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    8303036 Bytes = 7.9 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK

 
其中,0x84000000是放置uImage的起始地址。
0x86000000是放置ramdisk.img的起始地址。

说明:在boot为了支持大于4MB的ramdisk,进行了环境变量设置:

setenv bootargs console=ttyS0,115200n8 initrd=0x86000000,0x800000 root=/dev/ram0 rw mem=60M 

系统的DDR大小为128MB.

请专家们帮忙看下可能是哪里出了问题?

(1)百度google都说是uImage可能少了某个设备,但是指向性没那么好,不知道该如何解决。

 

问题的真正来源如下描述,有兴趣的继续看看,是让我们想要分离uImage和ramdisk的原因。

(6)以上是分离uImage和ramdisk的方法。当在uImage内核编译时将rootfs直接打包时,系统是可以正常启动的。

(7)但是,在两者打包到一起时,在挂载*.ko时有如下告警:

Starting syslogd/klogd: done
Starting thttpdipv6: relocation out of range, section 2 reloc 9 sym 'preempt_schedule'
ipv6: relocation out of range, section 2 reloc 9 sym 'preempt_schedule'

(1)所以想着要将两者分离。查了不少资料,说是超出了arm 32MB的什么限制,也不太懂,加了mlong-call也解决不了。

free看空间大约如下:

      total         used         free       shared      buffers
  Mem:        56412        33864        23548            0            0
 Swap:            0            0            0
Total:        56412        33864        23548

(2)尝试删除了一些/usr/lib下的库,然后就能够加载*.ko了。

insmod cmemk.ko 
CMEMK module: built on Sep 17 2014 at 07:01:51
  Reference Linux version 2.6.32
  File /home/zpfxellose/LeopardBoard_368_Public/ti-dvsdk_dm368-evm_4_02_00_06/linuxutils_2_26_01_02/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c
no physical memory specified, continuing with no memory allocation capability...
cmemk initialized

有耐性看到这里的,专家们看看是不有其他建议解决方案?

非常感谢。

  • 你好,

    能否换一种方式来制作ramdsik?

    http://processors.wiki.ti.com/index.php/Creating_a_RAMDISK

  • 你好,孟工,

    您说的方法应该和我提到的这个是一样的吧。

    bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
    bash# mkfs.ext2 -F -m0 –N 8192../initrd.img
    bash# mount -t ext2 -o loop ../initrd.img  /mnt
    bash# cp -r  * /mnt
    bash# umount /mnt
    bash# gzip -9 ../initrd.img
    mkimage -n "My Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.img、
    只有最后一步不一样,是因为需要打包成uboot识别的文件,其会增加一个64B的文件头