This is my study note of file system startup process.

系统启动一共可以分为4个阶段:

bootloder阶段

1
2
3
4
主要完成第一阶段系统的引导和初始化工作,系统上电后首先是CPU开始工作,引导程序会从ROM中被加载到RAM中,对CPU寄存器
进行初始化,启动核0,核1以及其他核此时都处于休眠状态,需要等待核0内核启动正常后通过中断或者事件将其唤醒,接下来就
是完成flash和ddr的初始化,为后面flash加载bin文件,ddr运行程序提供基本环境。一般情况下都是从flash为0的位置,将
bootloder的镜像加载到ddr或者RAM,该引导程序将uboot从flash移到DDR中,然后交给uboot处理。

bootloder通常被分为两个阶段的原因主要是为了解决一些特定的问题和实现功能。

  • 第一阶段
    1
    2
    第一阶段的引导程序一般非常的小巧,主要的任务是系统上电或重启时加载第二阶段的引导加载程序,它不依赖于复杂的文件系统或设
    备驱动程序,而是直接从引导介质读取固定的数据。
  • 第二阶段
    1
    2
    经过第一阶段的加载后,第二阶段的引导程序被加载到内存中,进一步初始化系统环境、加载操作系统内核、设置系统参数和启动操作
    系统。

uboot阶段

1
2
3
首先DRAM、串口、flash进行检查,保证uboot的运行环境,同时为linux分配内存空间。初始化网络配置,包括mac地址,通信端口工作
模式设置,可以让用户通过网络加载程序。最后将linux镜像复制到内存中,linux镜像包括馁内核、文件系统、设备树三个基本组件,
uboot根据设备树定义的信息进行检查,依次加载到内存中,加载完后就可以交接给内核进行操作。

内核启动阶段

1
2
3
主要负责创建进程、绑定进程、划分内存、唤醒核1、加载文件系统等基本工作,首先会生成一个init进程,后续创建的所有进程都是从
这个进程产生的,该进程还负责对内存和虚拟内存进行划分,然后vfork出一个主核进程,绑定到核0上,接下来由CPU主核唤醒其他核,
从init进程vfork出副进程,并将该进程绑定到核1,最后基于设备树完成对系统中其他设备的初始化。
  • 文件系统启动过程
    1
    2
    内核启动结束后,会根据用户配置的bootargs初始化文件系统,比如:
    配置rdinit=/init,内核会尝试执行文件系统根目录的init,init里面脚本进行初始化
  • 一般用户系统根据两种方式初始化:
    1
    2
    3
    init以及systemed,init一般是嵌入式的文件系统,比如手机系统,一般文件系统只是承载启动和执行命令、脚本的工作,因此可裁剪、
    只启动必要服务是首要。第二种systemed拉起服务的,一般是服务器级别的。systemd服务的配置在/etc/systemd/system.conf和/etc/systemd/system/XXX.service,
    可以整体配置systemd或者配置单个拉起的任务,很方便。

app启动阶段

1
主要负责对各类APP的初始化。