#####为了方便阅读,将把ramdisk的作用放在文章后面。
我使用的是TI公司am335x;
前面缺省文件系统的制作,可以见网上blog,使用busybox制作。
这里提供我实验过的文件系统链接(使用此文件可直接从第三步进行):
http://download.csdn.net/detail/taiyi2012/6850773
#####以下均在ubuntu10.04
1.目的:产生ramdisk文件(”ramdisk“可用其他名字代替)
操作:genext2fs -b 8192 -d /XXX/rootfs ramdisk
(MARK:genext2fs -b 8192 -D device_table.txt -d /XXX/rootfs ramdisk)
/* XXX 为rootfs的绝对路径,下同 */
2.目的:产生ramdisk.gz (在ramdisk所在目录进行)
操作:gzip -f9 ramdisk
结果:在当前目录下产生一个ramdisk.gz文件(14M左右)
3.目的:对内核压缩(在zImage所在目录进行)
操作:gzip -c9 zImage > zImage.gz
4.目的:产生最终文件(工作目录下需要有文件zImage.gz 与 ramdisk.gz)
操作:mkimage -A arm -O linux -T multi -C gzip -a 0x80008000 -e 0x80008000 -n "yourname" -d zImage.gz:ramdisk.gz Ramdisk
5.最后将Ramdisk文件拷贝到/tftpboot(如果前面是在/tftpboot 进行,忽略此步)
#####以下已进入u-boot
6.进入uboot:
u-boot#
我的默认环境为:console=ttyO0,57600n8 rw mem=128M root=/dev/ram
解释:mem=128M:内存大小
也可以通过命令setenv bootargs 命令来改变环境如:
u-boot#setenv bootargs root=/dev/ram rw console=ttyO0,57600n8 mem=128M
7.目的:烧写Ramdisk
操作:u-boot# tftp 0x82000000 Ramdisk
8.目的:启动内核
操作:u-boot# bootm
或者:u-boot#bootm 0x82000000
到这里就能正常进入内核了。
那为什么要有ramdisk这一步呢?为什么直接把编译好的uImage烧写到板子上启动不了呢?解释如下:(下文摘抄于其他blog)
【待完善】
RAMDISK简介:
Linux 中,rootfs 是必不可少的。PC 上主要实现有ramdisk和直接挂载 HD(Harddisk,硬盘)上的根文件系统;嵌入式中一般不从 HD 启动,而是从 Flash 启动,最简单的方法是将 rootfs load 到 RAM 的 RAMDisk,稍复杂的就是直接从Flash 读取的Cramfs,更复杂的是在Flash 上分区,并构建JFFS2等文件系统。
Ramdisk
是将一部分固定大小的内存( RAM
)空间模拟出硬盘分区。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件
( 如只读的根文件系统
) 通过 Ramdisk放在内存中,可以明显地提高系统的性能。
在
linux 系统中
,ramdisk 有二种
, 一种就是可以格式化并加载
, 在 linux内核2.0/2.2就已经支持,其不足之处是大小固定;另一种是 2.4的内核才支持,通过,ramfs来实现,他不能被格式化,但用起来方便,其大小随所需要的空间增加或减少,是目前linux常用的ramdisk技 术.
initrd
是 RAMDisk
的格式, kernel 2.4
之前都是 image-initrd
, Kernel 2.5
引入了 cpio-initrd
,大大简化了 Linux
的启动过程,附合 Linux
的基本哲学: Keep it simple, stupid(KISS). 不过cpio-initrd 作为新的格式,还没有经过广泛测试,嵌入式 Linux 中主要采用的还是 image-initrd。
在嵌入式环境中,我们将使用
RAMDisk 制作好的
rootfs 压缩后写入
Flash ,启动的时候由
Bootloader 装载到
RAM 中。在
Linux 的启动阶段,
initrd 提供了一套机制,可以将内映像和根文件系统一起载入内存并解压缩,然后挂载到 / 下。这种方法操作简单,但是在 RAM 中的文件系统不是压缩的,因此需要占用许多嵌入式系统中稀有资源 RAM。
由于/目录实在内存中,所以我们对根文件系统进行的操作并不会保存到Flash上,而是在RAM中。这样也就意味着,对根文件系统所作的修改,掉电后将会丢失.
Initrd
Initrd是在Linux中普遍采用的一种技术,就是由Bootloader加载的内存盘。在系统启动的过程中,首先会执行Initrd中的“某一个文件”来完成驱动模块加载的任务,第二阶段才会执行真正的根文件系统中的/sbin/init。这里提到的第一阶段是为第二阶段服务的,主要是用来加载根文件系统以及根文件系统存储介质的驱动程序。
资料中提到,存在多种类型的Initrd,实际应用中包括无Initrd、Linux Kernel和Initrd打包、Linux Kernel和Initrd分离以及RAMDisk Initrd。
目前,手中项目采用的就是第四种策略。在系统启动的时候,U-Boot会将Linux Kernel和Rootfs加载到内存,并跳转到Linux Kernel的入口地址执行程序。这篇文章将侧重对该种情况进行分析。