微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AM335x(TQ335x)学习笔记——挂载Ramdisk

AM335x(TQ335x)学习笔记——挂载Ramdisk

时间:11-28 来源:互联网 点击:
上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用。

(1)制作根文件系统

使用busybox构建根文件系统的步骤可以参考本博客的另外一篇文章,该文章链接如下:

S5PV210(TQ210)学习笔记——内核移植与文件系统构建

需要补充的是,文章"S5PV210(TQ210)学习笔记——内核移植与文件系统构建"中记录rootfs文件系统构建时漏掉了一步,没有在etc/sysconfig/目录下创建HOSTNAME文件,可以手动添加HOSTNAME文件,其内容为主机名称,本文使用了tq335x。在rootfs目录可以通过如下指令创建:

  1. echotq335x>etc/sysconfig/HOSTNAME

本文在已制作好的rootfs基础上,制作ramdisk。

(2)制作ramdisk

制作ramdisk的方式很多,最方便的是使用指令genext2fs。ubuntu操作系统上可以通过apt-get工具直接安装genext2fs工具:

  1. sudoapt-getinstallgenext2fs

其它操作系统也有类似的管理工具,这里就不一一列举了,下面使用genext2fs打包rootfs目录。命令如下:

  1. genext2fs-b4096-drootfs/ramdisk

然后使用gzip命令压缩ramdisk:

  1. gzip-9-framdisk

执行完成该命令后可以得到文件ramdisk.gz。

由于u-boot启动内核使用的ramdisk需要有u-boot的image头,故需要使用编译u-boot时生成的工具mkimage将ramdisk.gz制作为ramdisk.img。其中,工具mkimage位于u-boot的tools目录下,制作ramdisk.img的指令如下:

  1. u-boot-2014.10/tools/mkimage-Aarm-Olinux-Tramdisk-Cnone-a0x88080000-n"ramdisk"-dramdisk.gzramdisk.img

命令中mkimage前的路径根据自己实际执行的路径指定即可。

这样,就完成了u-boot可以使用的ramdisk制作,然后将ramdisk.img拷贝到SD卡的boot目录下即可。

(3)挂载ramdisk

老式的ATAGS方式启动内核时使用ATAG传递bootargs给内核,由于本文使用的dtb方式启动内核,故采取dtb的chosen方式传递bootargs给内核。

Step1: 修改内核配置

  1. makeARCH=armmenuconfig

进入配置项:

  1. Bootoptions--->

按N键取消配置项:

  1. []UseappendeddevicetreeblobtozImage(EXPERIMENTAL)

官方内核默认启用了该项配置。启用该项配置后内核兼容老式的ATAGS方式内核启动,关闭后则使用新式的dtb方式启动,故此处禁用了此项配置。

按ESC保存配置后退出menuconfig画面,重新编译内核:

  1. makeARCH=armCROSS_COMPILE=arm-linux-gnueabi--j8

Step2:添加bootargs到dtb

切换到内核目录arch/arm/boot/dts/,拷贝am335x-evm.dts为tq335x.dts:

  1. cpam335x-evm.dtstq335x.dts

打开tq335x.dts,在memory项后通过chosen方式添加bootargs,添加内容如下:

  1. memory{
  2. device_type="memory";
  3. reg=<0x800000000x10000000>;/*256MB*/
  4. };
  5. chosen{
  6. bootargs="console=ttyO0,115200n8root=/dev/ram0";
  7. };
  8. ...

其中chosen节点是新添加的,memory节点是原有的。

接下来重新编译dtb:

  1. makeARCH=armCROSS_COMPILE=arm-linux-gnueabi-tq335x.dtb

将新编译得到的tq335x.dtb拷贝到SD的boot目录下。至此,准备工作就完成了,下面我们使用新制作的ramdisk.img和tq335x.dtb启动内核。

Step3:使用新制作的ramdisk.img和tq335x.dtb启动内核

将SD插到开发板上,给开发板上电(开发板切换到SD卡启动模式),可以通过按任意键打断内核启动进入u-boot命令模式(由于之前没有配置u-boot的bootcmd环境变量,而默认的u-boot环境无法启动内核,故,开发板上电后不按键的话也会进入u-boot的命令行模式)。

首先是加载内核到DRAM:

  1. loadmmc0${loadaddr}/boot/zImage

其中,${loadaddr}在u-boot的环境变量中默认指定为0x82000000,这里可以直接打数字。

然后是加载dtb到DRAM:

  1. loadmmc0${fdtaddr}/boot/tq335x.dtb

${fdtaddr}的默认值是0x88000000。

接下来加载ramdisk到DRAM:

  1. loadmmc0${rdaddr}/boot/ramdisk.img

${rdaddr}的默认值是0x88080000
最后就是将ramdisk和dtb的加载地址作为参数启动内核:

  1. bootz${loadaddr}${rdaddr}${fdtaddr}

至此,Linux内核已经能够正常启动并进入终端模式了。

启动Log如下:

  1. Hitanykeytostopautoboot:0
  2. U-Boot#loadmmc0${fdtaddr}/boot/tq335x.dtb
  3. 34781bytesreadin9ms(3.7MiB/s)
  4. U-Boot#loadmmc0${loadaddr}/boot/zImage
  5. 4377824bytesreadin242ms(17.3MiB/s)
  6. U-Boot#loadmmc0${rdaddr}/boot/ramdisk.img
  7. 1120934bytesreadin68ms(15.7MiB/s)
  8. U-Boot#bootz${loadaddr}${rdaddr}${fdtaddr}
  9. Kernelimage@0x82000000[0x000000-0x42cce0]
  10. ##Loa

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top