基础——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文件系统

 

### eMMC KLM4G1FETE-B041CMD3 参数规格 eMMC (Embedded MultiMediaCard) 是一种嵌入式存储解决方案,广泛应用于移动设备和其他电子设备中。对于具体型号 **KLM4G1FETE-B041CMD3** 的参数分析如下: #### 1. 容量与接口标准 该型号属于三星的 eMMC 存储产品线,其容量为 4GB(基于命名中的 “4G” 部分)。此系列通常遵循 JEDEC 标准,支持 eMMC 5.1 协议[^1]。 #### 2. 工作模式支持 根据已知信息以及 eMMC 行业标准: - 支持 HS200 和 HS400 模式下的数据传输。 - 对于 DS(Data Strobe)信号的支持,在 HS400ES 模式下可以实现更高的性能表现。HS400ES 特性允许使用双沿采样技术来提升数据吞吐率。 #### 3. 性能指标 以下是可能涉及的关键性能参数: - **最大理论速度**: 在 HS400 或 HS400ES 下可达约 400 MB/s。 - **引脚定义**: 符合标准 eMMC 接口布局,共 8 引脚设计用于电源、时钟、命令和数据通信。 - **工作电压范围**: VCCQ = 1.7V ~ 3.6V, VCC = 2.7V ~ 3.6V. #### 4. 可靠性和环境适应能力 - 温度等级: 商用级 (-25°C 至 +85°C),适用于大多数消费类电子产品场景。 - ECC 能力: 内置错误校正机制以保障长期使用的稳定性。 ```python # 示例 Python 代码展示如何解析基本 eMMC 设备属性 def parse_emmc_parameters(model_name): capacity_map = {"4G": 4 * 1024} # Convert to MB if model_name.startswith("KLM"): base_info = { "manufacturer": "Samsung", "capacity_mb": capacity_map.get(model_name.split('G')[0][-1], None), "interface_standard": "eMMC 5.1" } return f"{base_info['manufacturer']} {model_name}, Capacity={base_info['capacity_mb']}MB, Standard={base_info['interface_standard']}" print(parse_emmc_parameters("KLM4G1FETE-B041CMD3")) ``` 以上代码片段展示了简单的模型名称解析逻辑,实际应用中需结合更详细的硬件文档完成全面评估。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值