bootloader源码ccs(bootloader源码分析)
本文目录一览:
- 1、bootloader源代码init.S解析
- 2、当前在嵌入式系统开发中有哪些常用的bootloader
- 3、物联网工程,学的有哪些方面,都有哪些知识
- 4、4412 bootloader怎么制作
- 5、linux在启动时,是如何检测各个硬件设备的?开机的时候bootloader检测过一次,加载内核之后,内核是如何检
- 6、ARM 开发板 问题
bootloader源代码init.S解析
血液暂不流动,我发现我弯弯曲曲,
我看见我在柔哈哈软的链节里观照自身,
用一道道目光染黄我幽深的森林。
我尾随一蛇,它刚咬了我一口。
它迤逦而行,多么蜿蜒的追求!
当前在嵌入式系统开发中有哪些常用的bootloader
常见bootloader介绍
1.U-BOOT介绍
uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从下载
U-BOOT是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案,从官方版本 0.3.2开始全面支持SC系列单板机。u-boot是一个open source的bootloader,目前版本是0.4.0。u-boot是在ppcboot以及armboot的基础上发展而来,虽然宣称是0.4.0版本,却相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是并不支持我们现在学习所用samsung 44B0X的开发板。
为什么我们需要u-boot?显然可以将ucLinux直接烧入flash,从而不需要额外的引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。
同时,u-boot移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。
2.vivi介绍(下载地址)
vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,如下:
命令
功能
Load
把二进制文件载入Flash或RAM
Part
操作MTD分区信息。显示、增加、删除、复位、保存MTD分区
Param
设置参数
Boot
启动系统
Flash
管理Flash,如删除Flash的数据
vivi代码分析
vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。
Vivi主要包括下面几个目录:
arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。
drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。
init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。
lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。
include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。
物联网工程,学的有哪些方面,都有哪些知识
要想成为系统的的物联网工程师需要系统学习。由浅入深地对嵌入式物联网技术以及Linux平台全面掌握,能够独立胜任物联网开发、嵌入式Linux应用开发、5G周边产品开发、底层系统开发、设备驱动开发、从终端到云技术开发以及Linux衍生产品等多方面工作。可以更加系统的了解嵌入式物联网相关行业知识。
具体所学知识包括:
1.嵌入式C语言高级编程及行业应用
2.各常用数据结构与算法相关知识,以及面向接口的编程
3.GUI图形库应用开发技术
4.Linux操作系统使用
5.Linux系统编程
6.Linux系统网络编程
7.Linux网络路由及数据交换技术
8.嵌入式数据库
9.嵌入式C++语言编程,以及面向模板库的应用开发
10.OpenCV、OpenGL等图像处理
11.AI模型训练及场景定位识别应用
12.RFID场景应用
13.zigbee低功耗网络技术
14.Bluebooth组网技术
15.MQTT云平台搭建技术
16.NB-IOT各大云平台通信技术
17.基于5G技术的嵌入式物联网行业应用
18.ARM体系结构
19.Bootloader启动过程
20.常见Bootloader源码及平台移植
21.嵌入式Linux内核裁减以及移植
22.嵌入式Linux平台搭建技术及技巧
23.Android ROM包制作流程
24.Android底层驱动开发
25.嵌入式从8位到64位硬件底层开发
26.嵌入式Linux设备驱动移植以及开发
如果有机会通过十个左右的大项目实践,掌握物联网+嵌入式实际项目案例开发流程,提高研发技能。
4412 bootloader怎么制作
Exynos 4412的启动过程分析
做实验时我们是把 bin 文件烧入SD卡,比如前面做的汇编流水灯实验。
问:是谁把这些指令从 SD 卡读出来执行?
答:是固化在芯片内部ROM上的代码---它被称为iROM ,iROM是厂家事先烧写在芯片上的,无源码。
iROM把启动设备上特定位置处的程序读入片内存 (iRAM) ,并执行它。这个程序被称为 ,并执行它。这个程序被称为 BL1(Bootloader 1) ,BL1 是三星公司提供的,无源码。
BL1又把启动设备上另一个特定位置处的程序读入片内内存,并执行它。这个被称为 BL2(Bootloader 2) ,是我们编写的源码。
在汇编流水灯程序中我们通过mkbl2工具制作的BL2,当时也做了比较详细的讲解,执行如下命令:
1
./mkbl2 leds_on.bin bl2.bin 14336
iROM 、BL1更细致的启动过程如下图所示(摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf):
(1) iROM :下图是 iROM 启动流程图
iRom Booting
由上图可以看出,首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式,只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数,一般都是linux内核的唤醒句柄。当然在裸机里都是冷启动的,休眠唤醒一般是不需要关注的,当然如果你的裸机程序需要支持休眠唤醒,就需要增加相应的代码了。
继续分析,设置IRQ及SVC模式的栈空间,这个时间,栈地址是其内部的一片IRAM,这小片RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,这里可以从多种外设启动,具体启动模式如下表:
OM select boot device
我们整个裸机教程都是从外部SD卡启动,根据OM启动模式,从SD卡拷贝前8K代码,如果拷贝成功,就验证校验和,BL1的前16个字节就是提供给IROM用来标识BL1相关信息的,具体信息如下(后面的教程我们会自己写一个BL1,现阶段先用三星提供的):
1
2
3
4
5
6
7
8
9
10
11
12
/*
* bl1 header infomation for irom
*
* 0x0 - bl1 size
* 0x4 - reserved (should be 0)
* 0x8 - check sum
* 0xc - reserved (should be 0)
*/
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
首先是描述BL1的大小,然后还有一个BL1的校验和,那我们怎么知道BL1的校验和呢,这个是在编译生成最终的二进制文件后,通过mk4412程序制作的
简单地说,iROM就是先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动 PLL 等 );然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/其他 ),把 BL1 从里面读出存入iRAM;最后启动 BL1 。
(2) BL1 :下图是 BL1 的启动过程
BL1 Booting
简单地说,也是设置程序运行环境(初始化中断、设置栈等 );然后从启动设备上把 BL2读入iRAM;最后启动它。
有几个问题需要解决:
① 在启动设备上哪个位置存放 BL1、BL2?
② 把BL1 BL2 读到 iRAM哪个位置?
③ BL1 、BL2 大小是多少?
④ 怎么保证 BL1 、BL2 程序的完整性(即读出程序时没有错误 )?
假设启动备为 SD 卡, 如下图所示(这里只分析SD卡启动):
BL1、BL2在SD卡上的存储位置
BL1、BL2在iRam中的存储位置
BL1 位于SD卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,为什么保留第一个扇区,如果有同学对DOS分区表有过研究,就能明白其中的道理了,第一个扇区是分区表的配置区),iROM从这个位置读入8K 字节的数据,存在iRAM地址 0x02021400位置处。 所以 BL1不能大于8K 。
IROM计算校验和且验证通过后并解密BL1成功后就可以跳转到BL1了,至此IROM已执行完备,权限已交由BL1了,补充说明一下,解密BL1是加密模式启动时才需要的,非加密模式启动是无需解密BL1的。
BL2 位于 SD 卡偏移地址 (512 +8K)字节处,BL1从这个位置读入14K 字节的数据,存在iRAM 地址 0x02023400 处。 BL2 不能大于(14K – 4) 字节,最后 4字节用于存放较验码(在汇编流水灯试验中我们用mkbl2工具制作的BL2,其中mkbl2工具最主要的作用就是计算出校验码)。
如果我们的程序大于 (14K – 4) 字节,那么需要截取前面 (14K – 4) 字节用来制作BL2并烧入SD卡偏移地址 (512 +8K) 字节处。当BL2启动后,由它来将存放在SD卡另外位置的、完整程序读入内存。
对于其他启动设备,可以参考 《Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf》,下面会附上下载地址。
linux在启动时,是如何检测各个硬件设备的?开机的时候bootloader检测过一次,加载内核之后,内核是如何检
可能是在init中检测吧,我也不大清楚,你可以去看看bootloader源码。
ARM 开发板 问题
学ARM牵涉到得知识很多,基础是C语言和单片机,学好C语言就有好的软件基础,学好单片机就有好的硬件基础。为什么说这两门是基础呢,道理很简单,arm就是一个复杂的单片机。
学习也是一个循序渐进的过程,一个人用单片用得多的时候他就会碰到瓶颈,例如在做某些项目时,单片机工作频率低,不能运行大型程序,这时我们想到用处理速度更高的单片机,这时ARM是一个不错的选择;有时我们要同时处理多个任务,但单片机同一时间只能处理一个任务(只能运行一个程序),或许你会想到用多个单片机来完成,不错的想法,但用ARM或许能更好的能帮你解决问题。
上面说过既然ARM也是一个单片机,那么ARM用什么办法来实现多任务处理呢,这时我们会想到多任务操作系统——常用的liunx操作系统。我们用ARM来运行操作系系统,再用这个系统来运行我们的程序,这不就实现了多任务吗,就像我们电脑一样,你电脑装了WINDOWS系统后就可边看电影变听歌曲了,设想一下电脑不装系统能干什么,这很有意思,在操作系统出现以前,他们用按键控制计算机程序的运行,和用按键来控制单片机有舍区别?那为什么单片机不能运行操作系统,这是因为单片机得工作频率低和内部资源少使单片机难以运行操作系统。
至于开发板能做什么,很简单,只要你玩会了LIUNX系统,那么你在linux环境下(一般指的装有linux系统的电脑)编的各种程序都能下载到ARM里立运行,因为ARM里运行LIUNX系统,应用程序都可在liunx上运行,例如你编个摄像头驱动,MP3播放器,电影播放器,一些游戏等。就像在windows上运行软件一样。
这些知识是关于入门前对于arm有一个较系的了解和理解,希望对你有帮助(纯手写)