嵌入式Linux系统的启动流程

第一:bootloader阶段
主要完成第一阶段系统的引导和初始化工作。

系统上电后,首先是cpu开始工作,此时引导程序(通常是汇编代码)从ROM被加载到RAM 中,对 cpu 的寄存器进行初始化,启动核 0,如果是核1或者其他核则处于休眠状态,等待核 0 在内核启动正常后通过中断或者事件将其唤醒(图中10的位置)。

接下来就是完成 flash 和 ddr 初始化,为后面从 flash 加载 bin 文件,在 DDR 中运行程序提供基本环境,一般情况下都是从flash为0的位置,将flash中的bootloader 镜像文件加载到 RAM 或 DDR 中,该引导程序最终将uboot从flash 复制到 DDR 中,然后交接给 uboot 进行下一步处理。

​第二:uboot 阶段
首先对 dram,flash,串口进行检查,保障 uboot 的运行环境是 ok 的,同时为 linux分配内存空间;接下来初始化网络配置,包括mac地址的设置、通信端口的工作模式设置,可以让用户通过网络加载程序;最后将linux从flash中复制到内存中。

linux 镜像文件中包含内核、文件系统和设备管理树 (FDT) 三个基本组件,uboot 会根据设备管理树定义的信息进行检查,然后依次加载到内存中 。包括序号4~5,这个阶段最后将 linux 加载后,就可以交接给内核进行操作。

​第三:内核启动阶段
主要负责创建进程、绑定进程、划分内存、唤醒核1、加载文件系统等基本工作。

首先,会生成一个初始进程 init0,后续创建的所有进程都是从该进程中产生,该进程还负责对内存和虚拟内存进行划分。

然后 vfork 出一个主核进程,绑定到核 0 上,接下来由 cpu 主核(核0)唤醒其他的核,从 init 进程 vfork 出副核进程,并将该进程绑定到核1上。

最后是基于设备管理树完成对系统中其他设备的初始化。

​第四:app启动阶段
这一阶段主要对各类 app 应用进行初始化,如文中以通信设备为例,此处主要完成对转发芯片的初始化,会涉及一些基础转发表项的初始配置,端口和各种通信总线的初始化。

接下来会初始化中间件,中间件是作为应用程序和操作系统之间的桥梁,向下屏蔽操作系统的差异,向上为应用程序提供平台化的技术支持;最后就是各种应用程序的初始化了,包括各种特性的初始化,心跳信息,单板信息,版本信息等等。

日常工作中,最容易出问题的地方其实都是在 app 的启动阶段,这部分才是最应该做一个详尽的图出来,后续笔者有了具体的项目案例后将会补充该图例。​​

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏马潜行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值