基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)

以三星的四核处理器Exynos4412为例,该开发板属于armv7架构,contexA9系列,32bit,cpu4核心1.5GHZ主频,eMMC 大小型号为:KLM4G。

ARM里面,启动MMU以后,我们编程看到的地址都是虚拟地址,经过MMU以后才是具体的物理地址。

4412在上电以后,MMU是关闭的,也就是说这个时候其实和单片机差不多,可以直接跑裸机程序(裸机程序,就是直接对CPU进行编程),就跟单片机一样,但是,在Linux启动以后,操作系统就会把MMU打开,也就是说,虚拟地址就会出现。

1. BootLoader启动过程

ARM上电后,是从0地址开始取指令执行,先看:

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第1张图片

可以看出0地址在iROM中,即上电以后会执行它芯片内部iROM中的一段程序,这段程序是固化在芯片内部的,厂家烧进去的,我们看不到。iROM这段程序作用是什么?

答:它会做一些初始化的工作,同时大部分开发板都可以从TF卡启动,也可以从EMMC启动,还可以从USB启动,这些功能的切换就是通过IROM来实现的。

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第2张图片

OM 就是启动方式,例如设置如下:

IROM程序会根据管脚设置(板子上可以搞个拨动开关),选择从eMMC中寻找启动程序,如果找不到有效程序,再选择从TF卡启动。继续:

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第3张图片

已经知道,上电后,先执行iROM程序,会选择好从哪里启动(假如是eMMC),所以,自然而然的就去外部eMMC芯片找启动程序,找到以后,首先会拷贝8K的程序到内部RAM执行(垫脚石),这8k程序在BL1(BootLoader1)中,在这里得8k是被三星固化了隐藏起来的,看不到。执行BL1干嘛呢?

 BL1可以初始化系统时钟,UART,SDRAM等设备,然后会跑到BL2(Bootloader2)中,拷贝其内部程序到SDRAM中执行。BL2干嘛的呢?

BL2可以支持更强大的功能,它会把我们熟悉的真正的Bootloader(例如Uboot)拷贝到内存中执行,这样BootLoader就可以启动起来了。

2. 内核启动

上面介绍了加载引导程序的过程,包括固化在固件中的boot代码(看不见、不能改)和BootLoader(开发者移植)两大部分。但并不是所有嵌入式系统中,都必须有这两部分,有些就没有固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成,同样是从地址0x00000000处开始执行,而这个地址处安排的通常就是系统的BootLoader程序。

bootloader一上电就拿到了cpu 的使用权,它当然得干一些初始化的工作啊,比如关闭看门狗、设置cpu 的运行模式、设置堆栈等等比较急迫的事情。当然还要对主板的一些其他硬件进行简单的初始化,比如外部DDR内存、网卡、显示屏、nand flash等等的初始化工作,最后当bootloader 完成它的使命之后就会把cpu 的使用权交给下一部分代码:kernel(内核) 。

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第4张图片
内核启动的作用就是进行系统硬件探测硬件驱动的初始化(比如SPI、蓝牙、以太网等等,所有的驱动都在里面,内核空间的相关工作已经完成,开始向用户空间转移,内核空间通过一个间接的initrd(一个虚拟的文件系统)向用户空间过度,然后开始挂载根文件系统。

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第5张图片

3. 挂接文件系统

文件系统的百科解释:

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

表现出来就是,可视化界面,用户对文件的复制、粘贴、删除等等操作。

基础——ARM系统的启动流程(boot loader,Linux 内核,文件系统之间的关系)_第6张图片

文件系统实现对磁盘空间的统一管理,一方面文件系统对磁盘空间进行统一规划,另外一方面文件系统提供给普通用户人性化的接口。就好比仓库中的货架,将空间进行规划和编排,这样根据编号可以方便地找到具体的货物。而文件系统也是类似,将磁盘空间进行规划和编号处理,这样通过文件名就可以找到具体的数据,而不用关心数据到底是怎么存储的。

其过程:initrd ----> /sbin/init ----> /etc/inittab

initrd是一个虚拟的文件系统,里面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目录,其目录有点像真的/,所以我们称之为虚拟的根文件系统,作用就是将kernel和真的根文件系统建立关联关系,让kernel去initrd中加载根文件系统所需要的驱动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程init。

init执行完毕以后会启动系统内的/etc/inittab文件,来完成系统的初始化工作。

补充:Android系统 = 大改的Linux内核+Android文件系统

 

你可能感兴趣的:(计算机基础,ARM,底层)