组成

bootloader + kernel + rootfs

启动

  1. CPU 中固化的一小段代码,会操作 SPI 控制器,从 SPI Flash 0 地址开始读数据到 RAM(一般读最开始的 4K,是 bootloader 的前 4k,bootloader 一般一两百k大小)
  2. CPU 开始从 RAM 读取指令并执行;
    1. 执行 bootloader 第一部分(第一部分是汇编代码且不做压缩,第二部分是 C 代码且有压缩)
    2. 初始化CPU、DDR、PLL、Cache
    3. 解压第二部分 Image,并拷贝到内存执行
  3. CPU 执行 bootloader 第二段代码
    1. 完成串口、Flash、网口等驱动的加载,并构建一个 shell 环境来接受用户输入。
    2. 整个 bootloader 运行期间 CPU 的 MMU 是没有初始化的,所有的地址访问都是采用物理地址直接访问的。
    3. 解压 kernel 并拷贝到 RAM
    4. 准备好内核的启动参数,如 console=ttyS0,115200 root=31:2 mtdparts=ar7100-nor0:196608(boot),835236(kernel),-(rootfs) 这里主要是把 bootloader 里设置的 MTD 分区信息传递给内核,还有需要加载的根文件系统
    5. 跳转到 kernel 入口开始运行
  4. kernel 代码开始运行
    1. kernel 各个子系统初始化
    2. MMU 初始化。(MMU 功能简介:CPU 执行单元发出的内存地址将被 MMU 截获,从 CPU 到 MMU 的地址称为虚拟地址;MMU 将这个地址翻译成另一个地址发送到 CPU 芯片的外部地址引脚上,这个地址称为物理地址。)
    3. 挂载 rootfs(要挂载的 rootfs 是通过内核启动参数来获取的)
    4. kernel 对 Flash 的访问都是通过 MTD 子系统来进行的,它抽象了对各种 Flash 设备的访问,提供统一的接口
    5. 初始化各种类型的驱动程序
  5. 启动 /sbin/init
    1. 执行 rcS
    2. 启动 shell