您的位置:首页 > 运维架构 > Linux

Zynq-Linux移植学习笔记之三-ramdisk

2017-01-19 17:44 417 查看
在zynq上进行linux加载过程中,需要用到一个很重要的文件-ramdisk,在网上百度了一下,发现ramdisk在内存区外分配一个综合的块,用它作为文件系统的回写堆。这个块的是固定大小的,所以挂载的文件系统也是固定的。目前流行的是采用ramfs,这些不同类型文件的区别请参考:http://www.360doc.com/content/12/0731/16/6828497_227493670.shtmlhttp://blog.csdn.net/awkwardgirl/article/details/23832311

下面用一张图简单介绍一下ramfs的产生过程:



如上图所示,收集到的一些嵌入式相关的源码以及package经过PC上的GCC,binutis等工具编译后得到gcc编译器,ld,obj,库等,注意这里编译得到的就是嵌入linux的相应编译工具,它们共同组成嵌入式编译环境的Toolchain。举个例子来说,PC上的gcc是基于X86的,而编译得到的gcc就是基于arm的了。

接下来使用编译得到的toolchain对package进行编译得到target,packets等,再加上原来的库,一齐打包放进文件夹中。该文件夹按照内核中的形式进行组织,包含bin dev etc lib proc sbin sys usr mnt tmp var等相应内容。使用scripts/gen_initramfs_list.sh脚本对该folder进行处理创建cpio格式的initramfs文件(具体又分为先创建list,再使用gen_init_cpio创建得到cpio),最后通过gzip进行压缩得到initramfs.cpio.gz,该文件就是ramfs压缩格式。将该文件编译进kernel后能得到vmlinux.bin,将bin文件通过tftp加载到内存中即可运行linux(前提u-boot已经启动)。

不过,目前zynq并不是采用这种方式加载linux,由于采用的是ramdisk,必须要把ramdisk,uimage,devicetree下载到内存中,内存按照不同的地址进行加载。可以参看u-boot目录下include/configs/zynq_common.h文件第200行开始的代码,该段代码说明了需要加载的文件,摘抄如下:

"norboot=echo Copying Linux from NOR flash to RAM... && " \
"cp.b 0xE2100000 0x3000000 ${kernel_size} && " \
"cp.b 0xE2600000 0x2A00000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"cp.b 0xE2620000 0x2000000 ${ramdisk_size} && " \
"bootm 0x3000000 0x2000000 0x2A00000\0" \
"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
"sf probe 0 0 0 && " \
"sf read 0x3000000 0x100000 ${kernel_size} && " \
"sf read 0x2A00000 0x600000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"sf read 0x2000000 0x620000 ${ramdisk_size} && " \
"bootm 0x3000000 0x2000000 0x2A00000\0" \
"uenvboot=" \
"if run loadbootenv; then " \
"echo Loaded environment from ${bootenv}; " \
"run importbootenv; " \
"fi; " \
"if test -n $uenvcmd; then " \
"echo Running uenvcmd ...; " \
"run uenvcmd; " \
"fi\0" \
"sdboot=if mmcinfo; then " \
"run uenvboot; " \
"echo Copying Linux from SD to RAM... && " \
"fatload mmc 0 0x3000000 ${kernel_image} && " \
"fatload mmc 0 0x2A00000 ${devicetree_image} && " \
"fatload mmc 0 0x2000000 ${ramdisk_image} && " \
"bootm 0x3000000 0x2000000 0x2A00000; " \
"fi\0" \
"usbboot=if usb start; then " \
"run uenvboot; " \
"echo Copying Linux from USB to RAM... && " \
"fatload usb 0 0x3000000 ${kernel_image} && " \
"fatload usb 0 0x2A00000 ${devicetree_image} && " \
"fatload usb 0 0x2000000 ${ramdisk_image} && " \
"bootm 0x3000000 0x2000000 0x2A00000; " \
"fi\0" \
"nandboot=echo Copying Linux from NAND flash to RAM... && " \
"nand read 0x3000000 0x100000 ${kernel_size} && " \
"nand read 0x2A00000 0x600000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"nand read 0x2000000 0x620000 ${ramdisk_size} && " \
"bootm 0x3000000 0x2000000 0x2A00000\0" \
"jtagboot=echo TFTPing Linux to RAM... && " \
"tftpboot 0x3000000 ${kernel_image} && " \
"tftpboot 0x2A00000 ${devicetree_image} && " \
"tftpboot 0x2000000 ${ramdisk_image} && " \
"bootm 0x3000000 0x2000000 0x2A00000\0" \


从代码中可以看到,都是加载kernel image(对应uImage),devicetree image(对应devicetree.dtb),ramdisk_image(对应ramdisk)。将这三者配合好按照不同的启动方式放入内存相应的地址即可完成加载。

zynq ramdisk制作详细内容请看:http://blog.csdn.net/webhack/article/details/7388039 注意编译ramdisk或者ramfs需要使用root权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: