基础——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地址开始取指令执行,先看:

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

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

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

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

已经知道,上电后,先执行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(内核) 。


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

3. 挂接文件系统

文件系统的百科解释:

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

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

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

其过程: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文件系统

 

Zynq是一款由Xilinx公司推出的高度集成的可编程系统芯片,它融合了双核ARM Cortex-A9处理器和FPGA可编程逻辑单元。在使用Zynq进行系统开发时,我们可以选择将系统引导(启动)方式设置为从EMMC(嵌入式多媒体卡)启动。 EMMC是一种高集成度的存储设备,类似于SD卡,通常用于嵌入式系统中。在Zynq中,EMMC可以作为启动设备,用于存储和加载引导镜像(Boot Image)。 首先,我们需要将引导镜像生成为可以在EMMC上加载的格式,通常为BOOT.BIN文件。BOOT.BIN文件包含了FSBL(First Stage Boot Loader)和bitstream文件。FSBL是Zynq启动过程中的第一阶段引导加载程序,它负责初始化硬件、加载FPGA bitstream以及启动处理器核心。 然后,通过将该BOOT.BIN文件写入EMMC存储设备中,可以利用Zynq的启动ROM程序来从EMMC引导系统。启动ROM程序会首先加载FSBL到处理器的内存中运行,并由FSBL继续完成引导过程。 在FSBL的引导过程中,它会首先加载FPGA的bitstream,通过配置FPGA可编程逻辑。接着,FSBL会初始化处理器并加载U-Boot引导加载程序。U-Boot负责加载Linux内核映像和根文件系统到内存中,并将控制权转交给Linux内核。 通过这种方式,Zynq从EMMC启动系统能够快速、稳定地加载并运行复杂的嵌入式应用程序。同时,通过调整引导镜像的配置,还可以轻松实现其他启动方式,如从SD卡、网络等启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值