• 介绍BootLoader、PM、kernel和系统开机的总体流程


    一、开机总体流程

    在这里插入图片描述

    二、相关的子系统

    bootloader:嵌入式系统的引导加载程序,用于硬件设备初始化
    PM:低功耗电源管理程序,待机及唤醒支持
    recovery:android的修复子系统,复位及系统升级支持
    kernel:linux内核,硬件维护,底层支持。
    Android:基于linux的开源系统,框架与应用层。

    三、各个环节做了什么

    在这里插入图片描述

    四、bootloader的介绍

    在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。

    1、常用的bootloader:uboot

    选择uboot的理由:

    • 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
    • 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;
    • 较高的可靠性和稳定性;
    • 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
    • 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
    • 较为丰富的开发调试文档与强大的网络技术支持;

    2、uboot主要用来做什么

    在这里插入图片描述
    硬件初始化(设置处理器模式、关闭看门狗、屏蔽中断、初始化sdram、设置栈、设置时钟、从flash引导内核到内存)
    上电判断:
    AC/DC开机:
    AC,Alternating Current,交流电,我们通常代指硬上电
    DC,Direct Current,直流电,我们通常代指软开机
    开机根据bootmode判断上电开机、上电待机、上电记忆

    3、U盘升级

    在这里插入图片描述

    4、AB分区和recovery

    在这里插入图片描述

    5、uboot的ab分区

    • 校验完整性(flash)
    • 判断分区active
    • 根据需要启动加载active分区数据

    6、bootcmd和bootargs

    uboot的两个环境变量
    uboot的环境变量:本质是一个字符数组,在uboot中其实是作为一个全局变量在读写使用。 可以通过串口在boot的shell窗口通过setenv,printenv,savenv等命令操作,常用于调试。 uboot运行时从flash加载到DDR中使用。修改后,使用saveenv,会把DDR中的环境变量更新到flash中。注意,saveenv时其实整个环境变量都被保存了一遍,而不是只保存更改了的。

    • bootargs:是系统的启动参数,通过cmdline的方式传递给kernel。常见的调试项如loglevel,selinux开关等都通过bootargs从boot传递给kernel实现。
    • bootcmd:是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。

    五、PM(低功耗电源管理程序)

    1、PM主要负责

    • 待机功耗管理
    • 触发唤醒

    2、PM在代码中体现

    一个main函数初始化,然后进入vTask,死循环等待唤醒。
    在这里插入图片描述

    3、常见的唤醒方式

    IR唤醒、按键唤醒、CEC唤醒、RS232唤醒、网络唤醒、IO唤醒等

    4、PM调试开发注意事项

    • PM可控制的IO有限,大部分IO在PM下无法控制,电子设计时需要考虑,如需待机时控制的IO口需要使用PM口,如LED灯。
    • PM程序空间有限,无法实现多/复杂的功能。极端情况需要做功能取舍。

    六、kernel

    系统内核,Android的基石

    • 管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力;
    • 管理内存,决定内存的分配和回收,也就是内存管理的能力;
    • 管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
    • 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。
      在这里插入图片描述

    1、kernel启动阶段

    • 内核引导阶段。通常使用汇编语言编写,主要检查内核与当前硬件是否匹配。这部分也与硬件体系结构相关。内核引导阶段相关的代码主要位于 kernel /arch/arm/kernel/head.S和kernel /arch/arm/kernel/head-common.S。
    • 内核启动阶段。引导阶段结束前,将调用start_kernel()进入内核启动阶段。内核启动阶段相关的代码主要位于kernel/init/main.c。

    2、init进程

    Android系统的核心进程,kernel启动完后,在用户空间启动init进程,再通过init进程,来读取init.rc中的相关配置,从而来启动其他相关进程以及其他操作。Init进程承上启下,是Android启动的核心进程。

  • 相关阅读:
    【设计模式】适配器模式:攻敌三分,自留七分,以超兽武装的例子来谈谈适配器模式
    如何使用Flask request对象处理请求
    java面向对象(上)
    用于静电放电敏感器件的包装的性能和要求分类-2
    openradar中最后跟踪的解释
    C++面向对象编程题 第22题
    【阿里云数据采集】采集标准Docker容器日志:部署阿里云Logtail容器以及创建Logtail配置,用于采集标准Docker容器日志
    各地区收入差距不平等、基尼系数、省级层面(分城镇和乡村)
    Docker 容器常见故障排查及处理
    Vue3+TS+Node打造个人博客(前端架构)
  • 原文地址:https://blog.csdn.net/qq_43533553/article/details/125412696