Linux驱动(4)--Linux的启动流程

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的运行,在串口终端里会看到打印这样的信息:
Linux驱动(4)--Linux的启动流程_第1张图片
从打印信息可以看出uboot在检测内存,存储等设备,并且设置处理器等设备的时钟等。uboot在等待敲击任何键让他停下来,如果不敲击,它会开始引导内核,也就是把内核那个文件拷贝到内存中并运行。uboot把linux内核文件拷贝到内存以后就开始去内核去执行,然后打印出信息为:
Linux驱动(4)--Linux的启动流程_第2张图片
第一句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启动。
Linux驱动(4)--Linux的启动流程_第3张图片
④ iROM执行以后,会到外部找程序,找到以后,要拷贝8k的程序到内部RAM,这8k的程序就是BL1,也就是BootLoader1。该段程序是厂商写好的,无法开源的程序。
Linux驱动(4)--Linux的启动流程_第4张图片
⑤ 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---->挂接文件系统

附内存图:
Linux驱动(4)--Linux的启动流程_第5张图片
不是任何人写的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驱动)