Linux的启动流程

  • 1.Linux的启动流程概述
  • 2. 从串口打印日志中分析
  • 3. 以Exynos 4412启动流程为例

1.Linux的启动流程概述

ARM Linux 的启动流程大致为:Uboot → Kernel → Root filesystem。Uboot 在上电的时候就拿到 CPU 的控制权,实现了硬件的初始化。具体是怎么实现的呢?一起来看一下,CPU 的内部集成了小容量的 Sram,而 PC 指针一上电就指向 Sram 的起始地址 0x00000000,所以一上电 Uboot 代码就得到了运行。
Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。
在加载Linux内核之前,需要做的事情是:
① 初始化 RAM
因为内核要在 RAM 中运行,所以在调用内核之前必须初始化和设置 RAM,为调用内核做好准备。
② 初始化串口
内核在启动过程中可以将信息通过串口输出,这样就可以清楚的知道内核启动信息。虽然串口不是 Uboot 必须要完成的工作,但是通过串口可以方便调试 Uboot 和内核的各种信息。
③ 检测处理器类型
Uboot 在调用内核前需要检测系统的处理器类型,并将其保存在某个变量中提供给内核,内核在启动过程中会根据该处理器的类型调用相应的初始化程序。
④ 设置内核启动参数
内核在启动过程中会根据该启动参数进行相应的初始化工作。
⑤ 调用内核镜像
值得注意的是存储 Uboot 的存储器不同,Uboot 的执行过程也并不相同,一般来讲 Flash 分为 nor Flash 和 nand Flash 两种:nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在 Flash 上直接执行而不必复制到 RAM 中去执行。但是 nand Flash 并不支持 XIP,所以要想执行 nand Flash 上的代码,必须先将其复制到 RAM 中去,然后跳到 RAM 中去执行。如果内核存放在 nor Flash 中,那么可直接跳转到内核中去执行。但通常由于在 nor Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将内核复制到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到内核执行之前 CPU 的寄存器必须满足以下条件:r0 = 0,r1 = 处理器类型,r2 = 标记列表在 RAM 中的地址。

总结来讲,Linux先初始化一系列参数,然后再加载内核,内核运行起来之后要挂载一个文件系统(比如安卓系统)。

2. 从串口打印日志中分析

ARM开机先运行uboot文件。uboot的运行,在串口终端里会看到打印这样的信息:

从打印信息可以看出uboot在检测内存,存储等设备,并且设置处理器等设备的时钟等。uboot在等待敲击任何键让他停下来,如果不敲击,它会开始引导内核,也就是把内核那个文件拷贝到内存中并运行。uboot把linux内核文件拷贝到内存以后就开始去内核去执行,然后打印出信息为:

第一句starting kernel 说明uboot已经完成工作,然后内核开始工作。以上开始对各种设备进行初始化,比如SPI 蓝牙 dm9621也就是以太网等等。

初始化以后,开始挂载文件系统。linux内核,它执行到最后,挂载一个文件系统,为什么就能变出安卓系统?
实际上linux内核最后挂载那个文件系统,不仅仅是挂载,还有执行文件系统中的应用程序。安卓可以看做linux上面跑的一个巨大的应用程序,这个应用程序就放在了linux内核最后挂载的文件系统里面。

3. 以Exynos 4412启动流程为例

4412的启动顺序:
① 上电以后,mmu是关闭的,这个时候和单片机差不多,可以跑一些逻辑程序。
② linux启动以后,操作系统会将MMU打开,虚拟地址就会出现.
③ ARM上电以后,会从0地址开始读取执行指令。0地址就是iROM.iROM在4412内部,是ARM内部的一段程序。也就是说,4412上电以后会执行它芯片内部自己的一段程序,这段程序就在iROM中,这段程序是自带的,由厂商来完成。iROM的这段程序的作用是为了用户方便的选择从TF卡启动,也可以从EMMC启动,还可以从USB启动。

④ iROM执行以后,会到外部找程序,找到以后,要拷贝8k的程序到内部RAM,这8k的程序就是BL1,也就是BootLoader1。该段程序是厂商写好的,无法开源的程序。

⑤ uboot是怎么编译的?
uboot是执行了另一个脚本:build_uboot.sh,该脚本的内容为:
/*****/
cat
E4412_N.bl1.SCP2G.bin
bl2.bin
all00_padding.bin
u-boot.bin
tzsw_SMDK4412_SCP_2GB.bin

u-boot-iTOP-4412.bin
该脚本的内容为把五个文件,拼接生成最终的u-boot-iTOP-4412.bin
第一个文件E4412_N.bl1.SCP2G.bin就是bl1,前8k就是他,厂商给的,不开源
第二个文件bl2.bin 是bl2,也就是bl1执行后要加载的文件
第三个文件all00_padding.bin 这个完全是为了补齐用的,里面全部是0
第四个文件u-boot.bin 是真正的uboot源码编译出来的镜像文件
BL1执行以后加载BL2,然后把u-boot.bin加载到内存中去运行
最后一个文件是:tzsw_SMDK4412_SCP_2GB.bin 这个是ARM的一个新技术,也就是trustzoon技术,为了系统安全用的,可以暂时不管,实际上也可以不用
到这里,uboot就执行起来了
之后的就是 uboot加载linux内核zlamge,然后挂接文件系统。

总结一下启动流程:
iROM–>BL1—>BL2---->uboot---->zImage---->挂接文件系统

附内存图:

不是任何人写的uboot都能够刷到系统运行的,要拿到厂商的BL1才能通过检验,BL1是根据各个厂家的公钥,根据RSA算法生成的。

关于Bootloader可以参考:https://blog.csdn.net/qq_42580947/article/details/102538627
关于uboot可以参考:https://blog.csdn.net/qq_42580947/article/details/102538699

Linux驱动(4)--Linux的启动流程相关推荐

  1. Linux驱动——mmc sd card初始化流程(十一)

    Linux驱动--mmc sd card初始化流程(十一) 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1)[sd ...

  2. linux 检查mps版本,linux_mps启动流程_存储相关.doc

    linux_mps启动流程_存储相关 Linux-mips启动流程 -存储相关 linux内核启动的第一个阶段是从 /arch/mips/kernel/head.s文件开始的.而此处正是内核入口函数k ...

  3. 红帽linux设置自动启动,RedHat开机启动流程

    RedHat 开机启动流程 : 1. LILO 取得控制权. PC 起动时, 会读取开机磁碟第一条 cylinder 的第一个 sector(此即 MBR), 然後它会试着将读取到的程式码载入记忆体中 ...

  4. linux驱动开发笔记 一 基本流程

    linux驱动开发, 有特定的模式, 在我看来linux驱动只做了一件事, 将设备统一转换成了统一的3类虚拟设备 分别是: 1. 字符设备 2. 块设备 3. 网络设备 linux驱动开发, 需要在U ...

  5. 一起分析Linux系统设计思想——03内核启动流程分析(六)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直 ...

  6. Linux——Linux驱动之基本理论常识总结(什么是Linux驱动?Linux驱动需要掌握哪些?ARM处理体系架构及前世今生)

     [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <从0到1学习嵌入式Linux开发> 目录 0 ...

  7. Linux驱动学习--WPA扫描相关流程及WIFI通用接口NL80211/WEXT分析

    目录 1.引言 2.WIFI通用接口介绍 3.wifi协议接口层 4.Android wpa_supplicant源码分析–扫描scan过程 4.1 wpa_supplicant.conf配置文件的分 ...

  8. linux内核启动流程x86,linux内核-x86_32位内核启动流程

    arch/x86/boot/header.S 执行_start,第274行: .global _start _start: 然后跳转执行start_of_setup,准备实模式建立堆栈,BSS段清0, ...

  9. linux驱动开发扩展--内核启动logo

    static struct logo_data {int depth;int needs_directpalette;int needs_truepalette;int needs_cmapreset ...

最新文章

  1. ITK:计算灰度图像的梯度幅度递推高斯
  2. oracle按天创建分区,oracle 10g按天分区
  3. Linux——系统开关机指令简单学习笔记
  4. Atitit 命令指令的分类与权限 IMAP协议为例子 目录 1. 指令的作用的权限吧。 全局命令 未认证状态命令 未认证状态命令 选中状态指令 2 1.1. 1.在任何状态下都有效的指令(全局命
  5. docker运维工具
  6. 路由器mac地址克隆
  7. ucore源码分析step1
  8. Drawable的setBounds方法
  9. mac怎么修改hosts文件
  10. 十个全网最具创意的聊天机器人:漫威和联合国儿童基金会都在尝试使用聊天机器人...
  11. linux脚本第一行是什么,完全搞懂shell脚本第一行:#!/bin/bash的含义
  12. Linux计划任务、周期性任务执行
  13. js 排班插件_排班小程序
  14. 数字信号处理之信号的抽取和内插
  15. BQFP与BGA封装
  16. _ReturnAddress 使用
  17. 【Java】报错 java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx
  18. 从零开始学编程之说说培训机构那些事(一)
  19. php点击开始停止按钮,H5的开始暂停按钮
  20. Decorator模式------装饰边框与被装饰物的一致性

热门文章

  1. PL-VIO论文阅读
  2. ubuntu 自动挂载工具_Ubuntu设置开机自动挂载所有格式硬盘分区
  3. javaweb入门--web是什么
  4. Agc019_F Yes or No
  5. 最大子段和SP1716GSS3 线段树
  6. RocketMQ 顺序消费只消费一次 坑
  7. quartz定时程序无故停止并且没有错误
  8. 201521123013 《Java程序设计》第8周学习总结
  9. CodeForces 771C Bear and Tree Jumps 树形DP
  10. JS你可能还不知道的一些知识点(一)