通过前面的调试了解到s5pv210这个芯片的启动流程是需要将u-boot分为两部分的分别为SPL和u-boot。这里我使用网上的方式不直接使用u-boot的SPL连接脚本单独生成SPL的image而是用前面介绍的方法 [https://www.cnblogs.com/w-smile/p/13124631.html](u-boot 移植 --->3、S5PV210启动序列)将u-boot的前16k直接截取出来作为SPL。

IROM中

这一部分可以参考其他博文,或者三星的文档。

在IRAM中

通过启动连接脚本arch\arm\cpu\u-boot.lds 我们找到了整个代码的入口_start。全局寻找找到文件arch\arm\lib\vectors.S符合本次架构所以整个代码入口就在这里内容如下:

_start:

#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
.word CONFIG_SYS_DV_NOR_BOOT_CFG
#endif b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

所以可以看出来这里也是符合ARM架构要求,在这里定义了中断向量表,然后第一句指令是一个跳转指令,将执行流跳转到reset符号了,经过查找这个符号定义在arch\arm\cpu\armv7\start.S 这是架构通用的部分所以可以参考u-boot源码这里仅罗列这段程序操作的内容:

1. 检查是否使能了大物理页面扩展,如果使能了则进行必要的配置。(CP15)

2. 禁止IRQ和FIQ,配置处理器模式为SVC。(CPSR)

3. 设置_start 符号地址为异常向量表基址,并禁止cache,TLB,BP,MMU(CP15)

4. 调用lowlevel_init(如果定义了CONFIG_SKIP_LOWLEVEL_INIT_ONLY则不执行),这一部分就是芯片移植人员需要早期初始化的内容可以放在这个标号下实现,我这里就是配置时钟,配置芯片DRAM接口,配置UART0。

5. 设置堆栈为IRAM空间,并拷贝SD卡中特定地址的完整u-boot镜像到DRAM指定地址,SD的驱动实在芯片的IROM中完成的。(这一部分是本来的u-boot内容没有的因为我们未使用u-boot的SPL方式单独构建SPL程序所以修改了这部分内容)。

DRAM中

完成上面的操作后进行绝对跳转就能到DRAM地址空间继续运行代码了,因为代码本身就是连接在这个地址的。跳转后运行_main 符号处的指令他实现在rch\arm\lib\crt0.S 中操作序列大致如下:

1. 重新修改栈基址到DRAM地址空间中

2. 调整栈指针 (实际则是在栈中分配内存)这里是为malloc和struct global_data 的GD变量预留内存

3. 初始化 GD变量的部分成员,这是整个u-boot的一个重要的全局数据用来记录各种数据状态等。

执行了以上的处理步骤后将又可以使用C代码调用了。然后调用board_init_f 这是在common\board_f.c 中实现的属于u-boot的内容的代码,主要就是围绕GD变量进行操作详细的操作这里不深入分析,就是进行一些配置初始化相关的主要就是调用initcall_run_list 这个函数依次执行一个初始化list进行初始化,这个初始化函数数组init_sequence_f也是在common\board_f.c 中定义并根据u-boot的使用kbuild配置产生的配置文件编译生成。其中大部分初始化函数都是平台无关的少量与平台相关需要注意对应修改下,除此之外需要注意的是在这里执行board_init_f 相关调用时有打开cache。这里执行完成后GD变量的成员也越来越完善,再次根据GD中记录的信息修改SP栈指针。然后还需要再次移动并重定位代码,这一次移动是为了为了将u-boot放到DRAM高地址为拷贝Linux内核image准备空间,拷贝完成后无效指令和数据cache(因为原来地址空间的缓存已经无效了)。这里还使用了一个技巧使拷贝完成后直接返回到新地址的下一条指令执行。使用的方式就是在LR寄存器上做文章,具体参考代码实现。然后在次修改异常向量表地址到新的地址空间。注意的是这里代码重定向还是比较复杂一点的不是简单的拷贝,因为前面的GD变量也是需要维护的,主要就是然后对新地址的数据段的拷贝。然后就是调用common\board_r.c 文件中的board_init_r 函数,这个函数的实现和board_init_f 如出一辙他们末尾的字母就是标记他们调用的配置是在重定向前(f)和之后(r)执行的初始化。最后执行的就是 run_main_loop这里就是u-boot程序的主循环,在这里进行u-boot命令等相关功能的操作。

总结

u-boot的整个执行过程的粗流程其实是不复杂的,调试过程最复杂的感觉就是DRAM的配置那些部分。整个移植实际上出去kbuild配置工具外就是,一部分关于底层的初始化配置相关内容,其余就是u-boot的大致执行流程。流程我在做一下梳理总结如下:

_start(arch\arm\lib\vectors.S)向量表,然后跳转(reset)--->arch\arm\cpu\armv7\start.SARM 架构相关的操作,调用(lowlevel_init)---> 平台相关的底层或前提初始化部分的必要配置,调用(_main)--->arch\arm\lib\crt0.S 进行u-boot相关功能的变量,栈等部分的维护初始化等,调用(board_init_f)--->common\board_f.c 根据配置调用以系列的初始化调用,返回crt0.S,重定位u-boot代码在DRAM中的位置,调用(board_init_f)--->common\board_r.c 继续进行必要的初始化--->u-boot loop(如果引导Linux则u-boot就执行完了)。如果像知道更详细的内容可以参考这个博主的博客:https://to-run-away.blog.csdn.net/article/details/81711413?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control

u-boot 移植 --->7、u-bootl流程粗线条梳理的更多相关文章

  1. (转载)Kaggle_Titanic生存预测 -- 详细流程吐血梳理

    Kaggle_Titanic生存预测 -- 详细流程吐血梳理 https://blog.csdn.net/Koala_Tree/article/details/78725881 Kaggle中Tita ...

  2. 标题:u-boot 移植步骤详解

    1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目.从FADSROM.8xxROM.PPCBOOT逐步发展演化而来.其源码目录.编译形式与 ...

  3. -boot移植(十一)---代码修改---支持nandflash

    一.移植前的修改 1.1 include/configs/jz2440修改 原来的定义: 可以看出,要先定义CONFIG_CMD_NAND才能使能NANDFlash. 这个在我们文件中的82行有定义, ...

  4. 详解Spring Boot集成MyBatis的开发流程

    MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集. spring Boot是能支持快速创建Spring应用的Java框 ...

  5. Spring Boot(五)启动流程分析

    学习过springboot的都知道,在Springboot的main入口函数中调用SpringApplication.run(DemoApplication.class,args)函数便可以启用Spr ...

  6. Zookeeper 3.4.6 Client端流程粗略梳理

    首先从Zookeeper入手,Zookeeper-->ClientCnxn-->sendThread/eventThread public ZooKeeper(String connect ...

  7. cinder创建volume的流程-简单梳理

    1. cinder-api接收到创建的请求,入口:cinder.api.v2.volumes.VolumeController#create,该方法主要负责一些参数的重新封装和校验,然后调用cinde ...

  8. jeesite中activiti中的流程表梳理

    最近在利用jeesite开发一个小系统,趁着这个机会整理了activiti中的相关表,跟踪流程,然后查看这几个表中数据的变化,可以更好地理解流程的开发.现在整理出来,希望可以帮助更多的人! 表结构 一 ...

  9. zookeeper启动流程简单梳理

    等着測试童鞋完工,顺便里了下zookeeper的启动流程 zk3.4.6 启动脚本里面 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_ ...

随机推荐

  1. 【Windows】Win10家庭版启用组策略gpedit.msc

    [前言] 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已.那么我们让系统允许你使用就好了. [操作步骤] 1.首先你需要在桌面上新建一个txt文 ...

  2. 逃逸分析与栈、堆分配分析 escape_analysis

    小结: 1.当形参为 interface 类型时,在编译阶段编译器无法确定其具体的类型.因此会产生逃逸,最终分配到堆上. 2.The construction of a value doesn't d ...

  3. 服务注册中心:Eureka

    第一章 注册中心介绍 1.1.什么是注册中心 注册中心可以说是微服务架构中的"通讯录",它记录了服务和服务地址的映射关系.在分布式系统中,服务会注册到这里,当服务需要调用其它服务时 ...

  4. Java 操作 HBase 教程

    Java 操作 HBase 教程 一.简介 二.hbase-client 引入 三.连接操作 四.表操作 五.运行测试 相关博文原文地址: 博客园:美码师:HBase(2) Java 操作 HBase ...

  5. Chrome标签整理

    程序人生 设计素材类网站 关于生活 求职相关网站 Web前端 科技新闻相关网站 优秀资源内含丰富学习资料 项目实例视频资料等 面试简历相关 适合初学者自学的编程网站 国内优秀博客 由于平时经常浏览一些 ...

  6. 客户端,Scala:Spark查询Phoenix

    客户端,Scala:Spark查询Phoenix 1.pom.xml 2.配置文件 2.1config.properties 2.2MyConfig 3.entity实体(与phoenix中的tabl ...

  7. Hadoop伪分布式环境搭建+Ubuntu:16.04+hadoop-2.6.0

    Hello,大家好 !下面就让我带大家一起来搭建hadoop伪分布式的环境吧!不足的地方请大家多交流.谢谢大家的支持 准备环境: 1, ubuntu系统,(我在16.04测试通过.其他版本请自行测试, ...

  8. Spring 启动脚本

    if [ $# != 3 ];then echo 'option-1: start,stop or restart.' echo 'option-2: 请传入jar路径' echo 'option-3 ...

  9. Pytest(1)安装与入门

    pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍,它 ...

  10. WPF 之 Binding 对数据的校验与转换(三)

    一.前言 ​ Binding 的作用就是架在 Source 和 Target 之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实中的桥梁会设置一些关卡进行安检一样,Binding 这座桥上也可以设 ...