bootloader启动过程详细说明

2024-04-29 14:08

本文主要是介绍bootloader启动过程详细说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       今天早上看了一上午的bootloader简单源码,终于捋顺了bootloader的执行过程,之前只是知道bootloader代码会先被irom中的代码拷贝到iram中一部分,然后执行这部分代码,会把整个bootloader代码拷贝到sdram中,最终在sdram执行剩下的代码,而这段代码会把kernel拷贝到sdram的某个地址,最终引导起来整个内核。但是我今天早上看代码的时候看到一个问题,我所有的代码都是自己动手实现的,只要一步一步按照顺序来,不就可以实现么?为什么还要拷贝来拷贝去的。感觉直接按照跳转的方式,跳转值进行指令的跳转就行,但是想过之后,我意识到自己真是无知了。比如说在irom中执行的时候,会有一次跳转到iram中某一个地址,当然pc是肯定可以直接跳转到指定的任何一个地址,但是在这个地址中没有存放指令码,这时候,肯定是一个有去无回的过程,不仅这样,这个pc跳到这里后,就会很迷茫,前不着村,后不着店的,不知道自己的所去所从,就会死到这里。只有先把代码拷贝到将要跳转的地址中,pc指针才会顺着跳转后的指令继续执行,也就是说每一个指令都要负责人,确保执行完这个指令后,一定要有另一个指令去接纳pc。这样pc才会一直活在我的代码中。

下边我就再把我更进一步了解到的bootloader执行过程再重新叙述一下:

我使用的是s5pv210芯片、K9K8G08U0A型号的nand flash

 

第一步:cpu启动起来后,先来到0x00000000这个地址处(也就是irom的地址),此时会看到有一段代码(这是irom中固定的代码)在这里,这段代码会找到bootloader的第一段代码(以下就称为BL1)存放的地址,由于BL1存放在nand flash中,不支持片上执行,所以irom会把这段代码拷贝到iram中,
但是在拷贝之前,irom会先把iram的起始4个地址分别写上一定的内容(不过通常只写0x00地址为BL1所占空间的大小(一般是8k),而其他三个地址全写为0),把BL1这段代码拷贝到iram后,irom的使命就快要完成了,irom的最后一个任务就是把pc指针指向放BL1的那块地址的起始位置,然后就按照这个地址的指令开始执行。
第二步:这个时候开始执行BL1的代码。这段代码的功能是初始化硬件,比如串口,内存,显示器,按键等等。
在初始化所有需要初始化的硬件后,BL1还会有一个拷贝指令,就是要把bootloader拷贝到sdram中一般会把bootloader的代码放到BLADD(表示为bootloader在sdram中存放的地址。
这时候BL1的使命也将要完成,于是,BL1会把pc指针跳转到BL2的地址,此时所有要运行的代码都在sdram中,这次的跳转不会直接从这次拷贝的开始地址执行,而是跳过BL1代码所占的地址,从BL2开始执行。
第三步:执行BL2中的代码。此时BL2代码的功能主要是实现MTD设备驱动初始化,电源、时钟初始化,堆栈空间,以及各种必要的初始化,并且会提供一个命令行,可以进行交互。在这之后会有一个设置内核参数的过程,这些参数在内存中的存在方式也是以结构体存储,以链表进行关联的,而这个 链表有一个固定的起始地址-0x3000_0100;每一个结构体代表一个信息,并首尾相连,内核在需要这些参数时,就可以再对应的地址上取数据。这一步执行完毕后,就要把kernel的代码拷贝到sdram中的一个指定地址,并且会把这个地址强制转换成一个函数指针,并且向这个函数中传递一些参数,最终会到内核中执行内核代码。这个时候,内核就会被引导到执行状态。

 

 

这就是我今天大半天的心得,写出来,看到这篇文章的你,肯定也是对这方面感兴趣的,希望可以互相交流,尽情来吐槽我的这篇文章吧,把你所认为不对或者我没有想到的内容告诉我,大家共同进步!

这篇关于bootloader启动过程详细说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946299

相关文章

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

VMware9.0详细安装

双击VMware-workstation-full-9.0.0-812388.exe文件: 直接点Next; 这里,我选择了Typical(标准安装)。 因为服务器上只要C盘,所以我选择安装在C盘下的vmware文件夹下面,然后点击Next; 这里我把√取消了,每次启动不检查更新。然后Next; 点击Next; 创建快捷方式等,点击Next; 继续Cont

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

Docker启动异常

报错信息: failed to start daemon: Error initializing network controller: error creating default "bridge" network: cannot create network b8fd8c684f0ba865d4a13d36e5282fd694bbd37b243c7ec6c9cd29416db98d4b (d

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

mysql中存储过过程和游标的联合使用

1.SQL如下: DELIMITER //DROP PROCEDURE IF EXISTS PrintAllEmployeeNames5;CREATE PROCEDURE PrintAllEmployeeNames5()BEGINDECLARE error_count INT DEFAULT 0;DECLARE num INT ;DECLARE done INT DEFAULT

Modbus初学者教程,第三章:modbus寄存器说明

第三章:modbus寄存器说明 寄存器种类 Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。Modbus寄存器是指一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。寄存器的意义如下表所示。 Modbus协议定义了设备间的数据传输方式,包括数据格式和通信规则。Modbus寄存器是协议中用