一张图片胜过千言万语! 看图片:
上图是嵌入式系统启动流程图。 图中红色数字点表示启动顺序。 主要分为4个阶段,即:
第一阶段引导加载程序,
第二阶段uboot,
第三阶段内核启动,
第四阶段应用程序启动。
1.BootLoader阶段
主要完成系统第一阶段的启动和初始化工作,包括序号1~3。
系统上电后,CPU首先开始工作。 此时,引导程序(通常是汇编代码)从ROM加载到RAM中,初始化CPU寄存器,并启动核心0。如果是核心1或其他核心,则处于睡眠模式。 状态,内核正常启动后等待内核0通过中断或事件唤醒(图中位置10)。
接下来就是完成flash和ddr的初始化,为后面从flash加载bin文件并在DDR中运行程序提供基础环境。 一般情况下,flash中的bootloader镜像文件是从flash中的0位置加载到RAM或DDR中的。 ,boot程序最后将uboot从flash复制到DDR,然后交给uboot进行下一步处理。
嵌入式物联网确实有很多东西需要学习。 不要学错路线和内容,导致你的薪资水涨船高!
我免费给大家分享一个数据包,差不多150G。 学习内容、面试、项目都比较新、全面! 据估计,在网上购买某种鱼至少要花费几十美元。
点此找助手0元获取:点此获取中文版
2.uboot阶段
首先检查dram、flash、串口,确保uboot的运行环境没问题,并为Linux分配内存空间; 然后初始化网络配置,包括mac地址的设置和通讯端口的工作模式设置,让用户通过网络加载程序; 最后将linux从闪存复制到内存。
Linux镜像文件包含三个基本组成部分:内核、文件系统和设备管理树(FDT)。 uboot会根据设备管理树定义的信息进行检查,然后依次加载到内存中。 包括序号4~5,该阶段结束Linux加载完毕后,即可交给内核进行操作。
3. 内核启动阶段
主要负责创建进程、绑定进程、划分内存、唤醒core 1、加载文件系统等基本任务,包括序号6~13。
首先,生成初始进程init0。 后续的所有流程都是由这个流程生成的。 该进程还负责划分内存和虚拟内存。
然后vfork出一个主核进程,并将其绑定到core 0。然后主CPU核(core 0)唤醒其他核,从init进程中vfork出副核进程,并将该进程绑定到core 1。
最后基于设备管理树完成系统中其他设备的初始化。
4.应用程序启动阶段
该阶段主要初始化各种app应用。 例如,本文以通信设备为例。 这里主要完成了转发芯片的初始化,其中会涉及到一些基本转发表项的初始配置、端口和各种通信总线的初始化。
接下来,中间件将被初始化。 中间件充当应用程序和操作系统之间的桥梁。 它向下屏蔽了操作系统之间的差异,向上为应用程序提供基于平台的技术支持。 最后就是各个应用程序的初始化。 包括各种功能的初始化、心跳信息、板卡信息、版本信息等。
日常工作中,最容易出现问题的地方其实就是app的启动阶段。 这是应该制作详细图表的部分。 当我有具体的项目案例时我会补充图例。