3. 制作RAM disk(RamDisk也就是内存盘的意思)
所谓的RAM disk,实际上是把系统内存划出一部分当作硬盘使用。对于操作系统来讲内存的存取速度远远大于机械磁盘,所以RAM驱动器肯定要比机械的硬盘快得多。你可以把整个应用程序都安装在RamDisk的驱动器中,然后用内存的速度运行它.
ARM Linux采用RAM disk的方式来装载根文件系统,所有在运行内核之前,需要先制作RAM disk,将必须的文件和设备加入到RAM disk中,当内核启动后,会从指定地址去读取根文件系统,这里我们使用RAM disk,在内存中虚拟一个磁盘,具体方法如下:
1)首先创建一个512k的虚拟磁盘,文件名为initrd.img:
dd if=/dev/zero of=initrd.img bs=1k count=512
2)将虚拟磁盘文件格式化成ext2文件系统格式:
mkfs.ext2 -c initrd.img
这就生成了一个支持ext2文件系统的ramdisk
3)添加文件和设备
mount这个文件系统到/tmp下,mount -o loop -t ext2 initrd.img /tmp
4)向/tmp中添加linux启动必须的文件和设备
/bin/sh
/bin/init
/dev/console
/etc/rc
/etc/motd
以上这几个程序和设备是启动Linux必须的,这样得到的ram disk大约是400k。
代码:针对这几个目录的解释(感谢david的搜集整理)./bin/sh (/bin/sh是一个SHELL,用来启动系统时执行很多脚本程序的)/bin/init init进程的启动程序,在核内引导完成后,LINUX KERNEL都会执行/sbin/init,/etc/init or /bin/init/dev/console 是系统控制终端,可以理解为console指向激活的那个tty(准确地说是激活的那个tty才将输出显示到console) /etc/rc 当改变服务的运行级别时,此文件负责启动/停止服务/etc/motd 在管理员希望向 Linux 服务器的所有用户传达某个消息时使用,比如登陆时会打印出来 这里面的内容
4.内核的下载和执行
4.1.内核下载
内核的下载一般通过bootloader来完成的,当然也可以通过修改arch/arm/Makefile文件来设置自己的TEXTADDR;TEXTADDR的值在make时传递给arch/arm/vmlinux.lds,在链接时,arm-linux-ld将使用vmlinux.lds来定位内核的起始地址。
如果是压缩的内核,则可以在make menuconfig时,选择General setup->
Compressed boot loader in ROM/flash
(0) Compressed ROM boot loader base address
(c0000000) Compressed ROM boot loader BSS address
这里缺省的Compressed ROM boot loader base address是0。
4.2. RAM disk下载
RAM disk的下载也是通过bootloader来完成的,它的下载底子好是在内核源码文件arch/arm/machsa1100/assaber.c中定义的,在fixup_addabet()函数中设置了:
t->u.initrd.start = 0xc0800000;
t->u.initrd.size = 3 * 1024 * 1024;
我们制作的ram disk只有512k,所以需要修改t->u.initrd.size = 512 * 1024;下载地址为0xc0800000
4.3 内核运行
根据硬件情况修改源码编译之后,就可以通过bootloader下载执行了,内核运行时会通过串口向主机上的超级终端输出启动信息;当ARM linux启动并进入shell之后,就可以运行用户编写的应用程序了,添加自己的应用一般分为两个步骤:
1)交叉编译得到应用程序的可执行文件(elf格式)
2)将该可执行文件添加到ram disk中
|