典型ARM嵌入式Linux设备启动流程-S3C2440,S5PV210,AM3352x
导读:本文将以主流学习芯片为例,梳理以下典型的嵌入式Linux设备的启动流程,目前比较流行的学习型芯片有S5PV210、S3C2440、AM335x、IMX6ULL、STM32MP157。
目录
- 0、基础概念
- 1、S3C2440
- 2、S3C6410
- 3、S5PV210
- 4、AM335x和IMX6ULL
- 4、总结
0、基础概念
BL0:SOC内置在iROM里的代码,是芯片厂商事先烧好的代码,这部分代码会根据指定的引脚电平决定从什么设备启动。BL0就是Nand Flash,NorFlash,iNand等设备的复制函数(因为要读Flash,所以要简单初始化以下Flash),他的主要工作是把BL1从Flash中拷贝到iRAM或NorFlash上运行。(BL0是SOC出厂前设置的,芯片厂商也不知道板子上将来接的是什么样的DRAM,因此配置和初始化内存和Flash就交给BL1做)
BL1:是开发人员编写的代码,可以是自己写的裸机程序,也可以是uboot或其他。BL0只做了存储器的部分初始化,BL1需要关看门狗,设置时钟,设置异常中断向量表等工作。
iRAM:Internal SRAM 芯片内置的内存,可以直接运行程序。
SOC:System on Chip系统级别芯片,芯片内部集成cpu,内存,Flash等控制器,cache等
注:系统刚上电时,内存和Flash都没有被初始化而无法使用,只有iRAM(一般十几K)可以使用,而正真的代码在Flash里,Flash(Nor除外)不能直接运行程序。硬件相关介绍参考:ARM嵌入式硬件介绍
1、S3C2440
- 介绍
S3C2440三星公司研发的一款基于ARM920T内核的32位CMOS微控制器,主频最高400MHZ,结构相对简单,总体性能比S3C6410差。无iROM,4K iRAM。 - S3C2440内存地址表
- 如上图右侧所示,当外接了NandFlash并设置OM引脚为Nand启动,由于程序不能在nand上运行程序,所以片内4K内存(iRAM)的0地址就是整个内存的0地址;
- 当外接了NorFlash并设置OM引脚为Nor启动时,NorFlash的0地址就是内存的0地址,片内RAM基地址为0x4000_0000。
- S3C2440上电后从0地址开始运行,如果是nand启动则从iRAM上开始运行,如果时Nor启动就从NorFlash上开始运行。
- 外接Nand Flash时启动流程
此时iRAM(片内内存)基地址为内存0地址。
- 第一步:Reset复位后,Nand Flash控制器将Nand前4K代码复制到stepping stone中运行。
- 第二步:这部分代码负责配置内存和Flash,然后将uboot代码复制到内存中,然后跳转到内存中运行。
- 第三步:最后uboot启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
- 外接Nor Flash时启动流程
此时NorFlash的0地址为内存0地址。
- 第一步:Reset复位后,程序直接从NorFlash开始运行,初始化内存,将uboot拷贝到内存中
- 第二步:跳转到内存中运行,然后启动内核。
补充:NorFlash参与内存统一编址,即通过指针指向NorFlash内存地址直接操作Nor,而nand不参与,需要操作nand控制器来读写nand。
2、S3C6410
- 介绍
S3C6410是三星推出的基于ARM11架构的应用级SOC,主频最高667MHz
IROM(0x0800 0000)64M 只用了32K作为BL0, 0地址映射到IROM
IRAM(0x0C00 0000)64M 只用了8K,加载BL1,作为steppingstone - 启动流程
- 第一步:Reset复位后,从iROM中读取BL0执行,BL0将BL1复制到iRAM中运行
- 第二步:BL1初始化配置内存和Flash,然后将BL2(uboot主体代码)复制到内存中,然后跳转到内存中运行(uboot会判断自己是在iRAM中运行还是内存中运行,如果是iRAM则跳转到内存中运行;如果是在内存中则直接跳转到主体代码运行)。可以参考S3C6410启动流程。
- 第三步:BL2负责启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
3、S5PV210
- 介绍
S5PV210是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器,采用了ARM Cortex-A8内核,32K一级缓存、512K二级缓存,工作频率高达1GHz,支持2D/3D图形加速,支持全高清、多标准的视频编码。
IROM(0XD000 0000) ,大小为64KB,对于0地址处,是启动区域,也是采用的映射方式,与6410一样;
IRAM(,0xD002 0000),大小96KB,加载 BL1+BL2,steppingstone; - 启动流程
- 第一步:CPU上电后运行BL0,BL0会从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到iRAM运行。
- 第二步:BL1负责初始化Flash,然后将BL2读取到iRAM(剩余的80KB)运行
- 第三步:BL2负责初始化内存,将内核(OS)读取到内存中,然后启动内核。
- uboot启动流程
由于uboot一般远大于96K,实际上uboot并没有按照上述流程启动,uboot编译后会生成uboot-spl.bin(BL1)和uboot.bin,启动步骤如下:
- 第一步:上电后BL0开始运行,将uboot-spl.bin(BL1)加载到iRAM中运行
- 第二步:uboot-spl.bin直接去初始化内存和Flash,直接将uboot.bin复制到内存中,然后跳转到内存中运行,绕开了BL2。
- 第三步:uboot.bin运行,启动内核。
- S5PV210二次启动
BL0加载BL1后会计算BL1的校验和,如果不通过则启动失败,进行第二次启动,则从第二个设备读取BL1,如果校验还是不通过则通过串口启动,如果失败则通过USB启动,如果还是失败则整个启动过程失败,只要有一个成功就执行BL1。
4、AM335x和IMX6ULL
介绍
AM335X是TI(德州仪器)推出的基于 ARM Cortex-A8内核的微处理器,最高主频可以达600M/800M/1GHz,带NEON协处理器,二级高速缓存,24位LCD控制器和触摸屏控制器,分辨率高达2048*2048。
IMX6ULL是NXP(恩智浦)推出的基于ARM Cortex-A7内核的微处理器,最高主频800MHz,启动过程
- AM335x
启动流程和S5PV210类似,支持多种设备启动,SOC内部会保存一份启动设备的列表,然后按照这个列表的顺序去读取BL1,读取成功就执行BL1,失败就去找下一个启动设备,如果这是最后一个启动设备,就进入死循环。BL1就负责初始化Flash和内存,然后运行uboot主体代码,再启动Linux内核。
- IMX6ULL
IMX6ULL启动流程和AM335x一样,第一次启动失败就会判断是不是第一个镜像,如果是就设置SW引脚,指定下一次启动为第二个启动设备,然后复位重启。
- AM335x
4、总结
这些芯片启动流程都比较相似,上电后运行BL0,BL0去启动BL1,BL1初始化内存和Flash,然后将代码复制到内存,再跳转到内存中运行。
详细内容请参考官方数据手册:芯片手册下载
典型ARM嵌入式Linux设备启动流程-S3C2440,S5PV210,AM3352x相关推荐
- 嵌入式linux的运行过程,嵌入式linux的启动流程--详解
开门见山: 1.嵌入式linux启动第一步----Boot Loader Boot Loader在这里我就不细说了,详细分析起来的话有很多内容,网上也有很多讲解很详细的文章.这段小程序中我们可以初始化 ...
- PC机和嵌入式设备启动流程
一 PC机 和 嵌入式设备启动流程 1.PC机 (1)BIOS程序 [1]硬件初始化 (内存,其它硬件) [2]加载引导程序 (2)引导程序 grub,lilo 加载OS到内存 ...
- 嵌入式linux仪器,一种基于嵌入式Linux设备双系统的启动方法
一种基于嵌入式Linux设备双系统的启动方法 [技术领域] [0001]本发明涉及一种基于嵌入式Linux设备双系统的启动方法. [背景技术] [0002]Linux操作系统特别是其嵌入式系统由于其源 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- Linux驱动(4)--Linux的启动流程
Linux的启动流程 1.Linux的启动流程概述 2. 从串口打印日志中分析 3. 以Exynos 4412启动流程为例 1.Linux的启动流程概述 ARM Linux 的启动流程大致为:Uboo ...
- ARM嵌入式Linux系统设计与开发
ARM嵌入式Linux系统设计与开发 基本信息 作者: 俞辉 李永 刘凯 王晓虹 丛书名: 高等院校计算机教材系列 出版社:机械工业出版社 ISBN:9787111300045 ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- linux内核启动流程(文章最后流程图)
原文:linux内核启动流程 本文以Linux3.14版本源码为例分析其启动流程.各版本启动代码略有不同,但核心流程与思想万变不离其宗. 内核映像被加载到内存并获得控制权之后,内核启动流程开始.通常, ...
最新文章
- 2019年必须掌握的29个微服务面试问题(下)
- 基于Log4net插件
- k8s源码架构目录分析
- 深入理解分布式技术 - Kafka 高性能原理剖析
- 波卡链Substrate (3)SRML框架
- Python连接Mysql数据库SQL注入问题的解决
- 计算机运行卡英语怎么说,“芯片卡”英语怎么说
- oracle 取消exp权限,oracle 复制账号权限oracle11gexp导出问题:部分表导不出来
- java必会的英语单词
- 用函数判断考试得分:
- 2287 poj 田忌赛马,贪心
- 20款最优秀的JavaScript编辑器
- 计算机基础知识之信息技术初步
- 企业绩效管理的五种方法,你们是哪种?
- 关于光伏电站后运维时代运维模式的创新思路与构想
- dq电压方程耦合项符号问题
- 如何查询快递单号物流
- html标签中h4和h5,h5与h4的区别
- 搜索软件everything,搜索电脑中文件,快速定位
- python excel画图哪个好_Python excel 画图
热门文章
- java读取pdf的文字、图片、线条和对应坐标
- 卡诺模型(用户需求分析模型)
- 实战第二步:如何做一份有针对性的竞品分析
- 一键安装包php.ini,laravel 在windows中使用一键安装包步骤
- 安装74cms时出现的错误
- 计算机英语课文朗读,倍速英语点读电脑版
- 解决jdk证书问题-生成jssecacerts PKIX path building failed
- 海康威视sdk语音转发(实现)implementation ‘com.hikvision.ezviz:ezviz-sdk:4.8.3‘(修改)
- Educode--头歌 《软件工程》实验作业6-软件开发计划
- 软考-中级-网络工程师-知识点个人总结(一)