我们移植好uboot和Linux内核之后,当我们重启之后,开发板首先做的事情就是将nandflash前4K的内容复制到SRAM中去,由于SRAM只有4K大小,所以我们必须将初始化CPU、内存、中断、关闭开门狗以及nandflash中uboot拷贝到SDRAM中的的程序都放在这前4K的位置中去。
而将程序编译生成一个可执行文件的最后一个过程是链接,而链接生成的可执行文件又可以分成很多段。在GUN/GCC的工具链中,链接这个工作是链接器ld这个程序来完成的。而每个链接过程都由链接脚本(linker script,一般以lds作为文件的后缀名)控制。对于.lds文件,它定义了整个程序编译链接的过程,决定了一个可执行程序的各个段的存储位置。而决定uboot的代码的存储的位置的是u-boot 链接文件arch/arm/cpu/arm920t/u-boot.lds
. = ALIGN(4);
.text :
{
arch/arm/cpu/arm920t/start.o (.text)
board/lingyun/fl2440/lowlevel_init.o (.text)
board/lingyun/fl2440/nand_read.o (.text)
*(.text)
}
我们可以看到文本段中的文件存储的位置和顺序,依次是start.o lowlevel_init.o nand_read.o
当我们启动开发板后,可以看到secureCRT上的显示内容
这个时候内核开始启动了,这个内核是版本是linux3.0,根文件系统是initramfs。系统启动之后首先要执行的是init这个进程,init进程会执行initab这个脚本下的命令,主要有
1.挂载nandflash分区:
null::wait:/bin/mount -osync,noatime,rw -t jffs2 /dev/mtdblock6 /apps
null::wait:/bin/mount -osync,noatime,rw -t jffs2 /dev/mtdblock7 /info
2.使输出为串口输出,波特率为115200,显示为VT100:
null::respawn:/sbin/getty -LttyS0 115200 vt100
3.执行/etc/init.d/rcS这个脚本,在 /etc/init.d/rcS脚本中,我们可以看到:
for i in /etc/init.d/S??* ; do
$i
done
这个就是说执行在/etc/init.d目录下以S开头至少有两个字符的脚本,在 /etc/init.d目录下的脚本有:S01_network S04_dropbear S99_rcsApp rcS
S01_network 配置网卡启动的脚本
S04_dropbear 配置远程登录的脚本
S99_rcsApp 创建支持/apps/etc目录下的启动脚本,这个脚本的内容为
#
if (test -d /apps/etc/init.d)
then
for i in /apps/etc/init.d/S??* ; do
$i
done
fi
由于我们的根文件系统是initramfs,是在内存运行的,我们做了修改之后不会被保存,断点重启之后会消失,但是在内核启动的时候,我们就将nandflash的分区/dev/mtblock7挂载到了/apps目录下,所以我们可以将添加的其他脚本来存储到 /apps/etc/init.d/目录下,这个就可以保存在nandflash中,下次启动之后,依然可以使用。