移植好uboot和基于initramfs根文件系统Linux内核的开发板的启动

移植好uboot和基于initramfs根文件系统Linux内核的开发板的启动过程

分类:Linux学习

我们移植好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中,下次启动之后,依然可以使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

上一篇执行一个shell脚本而导致虚拟机centos6崩溃,慎重使用root权限

,不愧是春城,花香四季,品种繁多。

移植好uboot和基于initramfs根文件系统Linux内核的开发板的启动

相关文章:

你感兴趣的文章:

标签云: