zImage内核与ramdisk及bmem及vmalloc关系的研究探索


问题的初衷:
将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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值