问题的初衷:
将zImage的内核读入一段内存后,能否将rootfs(ramdisk方式运行)加载到紧挨着kernel之后?
担心的问题:由于zImage内核的特殊性,在跳转至内核执行入口之后,内核会自己解压缩自己,解压缩时是否占用额外内存?如过占用kernel之后的内存做为解压缩缓冲,那么就会和rootfs地址发生冲突。
测试:
给定不带rootfs的kernel vmlinuz-7260a(SDK17.1),rootfs.squashfs(大小是0x31E108)
test01:
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x41E108 usbdisk0:rootfs.squashfs;go 0x100000 'initrd=0x41E108,10M'
fail
分析:挂载rootfs失败的原因很可能是rootfs起始地址不对齐导致的,结合下文,其实不是地址不对齐问题
test02:将rootfs紧挨kernel,但做一个地址对齐:
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x420000 usbdisk0:rootfs.squashfs;go 0x100000 'initrd=0x420000,10M'
fail
test03:将rootfs远离kernel,做一个地址对齐:
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x820000 usbdisk0:rootfs.squashfs;go 0x100000 'initrd=0x820000,10M'
fail
分析:结合test01-03,最终发现无法挂载的原因是,go命令无法传递bootargs。
改为利用dram0(bolt中设定的dram0起始地址为0x100000)来启动内核:
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x41E108 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0x41E108,10M'
fail:此时加载失败是显而易见的,因为kernel解压缩之后的尺寸会远大于原来尺寸。
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x800000 usbdisk0:rootfs.squashfs;boot DRAM0 'root=/dev/ram0 rootwait rw rootfstype=squashfs initrd=0x800000,10M'
fail
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x2000000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0x2000000,10M'
ok,由此可以看出,rootfs的起始地址不能太靠前
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0xB00000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0xB00000,10M'
fail
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0xBE0000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0xBE0000,10M'
fail
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0xBF0000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0xBF0000,10M'
ok
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0xC00000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0xC00000,10M'
ok
load -raw -addr=0x100000 usbdisk0:vmlinuz-7260a0;load -raw -addr=0x1000000 usbdisk0:rootfs.squashfs;boot DRAM0: 'initrd=0x1000000,5586944'
ok
内核启动时的内存布局:
[ 0.000000] Memory: 227868K/1048576K available (6145K kernel code, 268K rwdata, 2172K rodata, 312K init, 188K bss, 804324K reserved, 16384K cma-reserved, 0K highmem)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xd0800000 - 0xff000000 ( 744 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xd0000000 ( 256 MB)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0827a7c (8319 kB)
[ 0.000000] .init : 0xc0828000 - 0xc0876000 ( 312 kB)
[ 0.000000] .data : 0xc0876000 - 0xc08b9268 ( 269 kB)
[ 0.000000] .bss : 0xc08bc000 - 0xc08eb1e0 ( 189 kB)
分析:rootfs即使放在bss之后,如果间隔不算大也不能挂载成功。
其它测试:
load -raw -addr=0