1、启动过程
每一个芯片都会有一个片内ROM,在出厂时厂家在其中固化好了一段代码,不可更改,这段代码执行第一阶段的启动任务。当芯片上电后,这段ROM-Code会读取启动引脚配置(boot configuration pins),然后根据引脚配置情况来决定以哪种方式下载接下来的外部启动代码(指的就是x-loader),下载的方式可以是NAND, UART,或者SD/MMC卡。
2、ROM-Code具体完成了哪些任务呢?
step1:初始化最小运行系统,包括时钟初始化、片内SRAM初始化以及一些芯片级外设的初始化。
step2:读取系统启动引脚配置后,按相应的启动设备列表的顺序,依次访问这些设备直到下载x-loader到SRAM成功。
step3:x-loader被下载到片内SRAM后,CPU控制权移交x-loader,ROM-Code任务结束。
二、第二阶段启动x-loader1、X-loader具体完成了哪些任务呢?
step1:配置复用引脚、初始化时钟频率、初始化片外SDRAM存储器
step2:CPU、板级外设初始化、串口控制台初始化
step3:读取启动设备,将u-boot读取到SDRAM中,控制权移交u-boot,并不再返回。
三、第三阶段启动任务u-boot和功能强大的u-boot相类似的BootLoader还有Blob,他们任务是通过各种方式将内核下载至SDRAM,并传递一些内核启动参数。所以介绍的相关资料也将u-boot的启动任务分成两个阶段stage1和stage2进行讲解。stage1主要完成基本硬件设备的初始化和为加载stage2部分的代码准备RAM空间,stage2则是为引导内核准备环境。另外,u-boot还可以工作在启动加载模式和下载模式,在启动加载模式下,是u-boot正常的工作模式,即正常的把内核加载到内核中,而在下载模式下,一般是u-boot要更新nand flash上的内核映像,或者是第一次烧写内核映像到flash。其实u-boot的功能和STM32处理器的IAP程序功能极为相似。
1、u-boot到底完成了那些任务呢?
stage1
step1:硬件设备初始化。
step2:为加载Bootloader的stage2准备RAM空间。
step3:拷贝Bootloader的stage2到RAM空间中。
step4:设置好堆栈。
step5:跳转到stage2的C入口点。
stage2
step1:初始化本阶段要用到的硬件设备。
step2:检测系统内存映射。
step3:将kernel映像和根文件系统映像从flash上读到RAM空间中。
step4:为内核设置启动参数。
step5:调用内核。
四、启动内核kernel加载根文件系统1、内核的启动过程分为三个阶段。
step1:内核的自解压过程。
step2:主要工作是设置ARM处理器的工作模式、使能MMU、设置一级页表等。
step3:主要为C代码,包括内核初始化的全部工作
2、加载根文件系统
根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。
那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。
根文件系统至少包括以下目录:
/etc/存储重要的配置文件。
/bin/存储常用且开机时必须用到的执行文件。
/sbin/存储着开机过程中所需的系统执行文件。
/lib/存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。
/dev/存储设备文件。



