OK6410A 开发板 (三) 13 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析2 relocate_vectors

本文主要是介绍OK6410A 开发板 (三) 13 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析2 relocate_vectors,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从链接角度分析 u-boot.bin 的构成
从运行的角度分析 u-boot.bin 前 64byte  的 relocate
  • relocate_vectors 的实现
#ifdef CONFIG_HAS_VBAR// 虽然走的是这一套,但是找到的协处理器cp15的C12的实现(DDI0301H_arm1176jzfs_r0p7_trm.pdf)和下面的内容对不上// 那就分析 #else 那条路// 这条路 其实就是 架构实现(ARM1176) 对(#else那条路) 做出的优化// 后面在 DDI0301H_arm1176jzfs_r0p7_trm.pdf P254 找到了,继续分析这条路/** If the ARM processor has the security extensions,* use VBAR to relocate the exception vectors.*/ldr	r0, [r9, #GD_RELOCADDR]	/* r0 = gd->relocaddr */mcr     p15, 0, r0, c12, c0, 0  /* Set VBAR */
#else/** Copy the relocated exception vectors to the* correct address* CP15 c1 V bit gives us the location of the vectors:* 0x00000000 or 0xFFFF0000.*/// r0 = gd->relocaddr// gd->relocaddr 起始的 8个32bit是 relocated exception vectorsldr	r0, [r9, #GD_RELOCADDR]	/* r0 = gd->relocaddr */// 读 cp15 Register 1:控制寄存器 ,并选择 选择架构上指定的控制寄存器// 读到 r2中mrc	p15, 0, r2, c1, c0, 0	/* V bit (bit[13]) in CP15 c1 */// bit[13] //该位用于选择异常向量的位置://	0=选择的正常异常向量(地址范围0x00000000-0x0000001C)//	1=选择的高异常向量(地址范围0xFFFF0000-0xFFFF001C)。//一个实现可以提供一个输入信号来确定复位后该位的状态。// 选择目标地址ands	r2, r2, #(1 << 13)ldreq	r1, =0x00000000		/* If V=0 */ldrne	r1, =0xFFFF0000		/* If V=1 */// 从 gd->relocaddr 拷贝到 0x00000000,拷贝了8个32bitldmia	r0!, {r2-r8,r10}stmia	r1!, {r2-r8,r10}// 又拷贝了8个32bitldmia	r0!, {r2-r8,r10}stmia	r1!, {r2-r8,r10}
#endif
gd->relocaddr 的 1632bit 是什么b reset // 占用 1个 32bitldr pc, _undefined_instruction // 占用 1个32bitldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq_undefined_instruction: .word undefined_instruction // 占用1个32bit
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq.balignl 16,0xdeadbeef // 占用1个32bit
0x00000000 在 芯片 memory map 的什么位置 // 0xFFFF0000 不存在于 memory map0x0000_0000 | 0x07FF_FFFF | 128MB  | Booting Device Region by XOM Setting 		| Mirrored Region
按照 ok6410a 的 电路图 OM[4:0]0011 , Boot device 为  RESERVED也就是说,但是 没有连接设备,那么 0x0000 0000 在哪里? // TODO
  • arch/arm/lib/vectors.S
.globl _start.section ".vectors", "ax"_start:b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq.globl _reset.globl _undefined_instruction.globl _software_interrupt.globl _prefetch_abort.globl _data_abort.globl _not_used.globl _irq.globl _fiq_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq.balignl 16,0xdeadbeef.globl IRQ_STACK_START_IN
IRQ_STACK_START_IN:.word 0x0badc0de宏汇编bad_save_user_regsirq_save_user_regsirq_restore_user_regsget_bad_stackget_irq_stackget_fiq_stack.align 5
undefined_instruction:get_bad_stackbad_save_user_regsbl do_undefined_instruction.align 5
software_interrupt:get_bad_stackbad_save_user_regsbl do_software_interrupt.align 5
prefetch_abort:get_bad_stackbad_save_user_regsbl do_prefetch_abort.align 5
data_abort:get_bad_stackbad_save_user_regsbl do_data_abort.align 5
not_used:get_bad_stackbad_save_user_regsbl do_not_used.align 5
irq:get_bad_stackbad_save_user_regsbl do_irq.align 5
fiq:get_bad_stackbad_save_user_regsbl do_fiq
  • u-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{. = 0x00000000;. = ALIGN(4);.text :{*(.__image_copy_start)*(.vectors)arch/arm/cpu/arm1176/start.o (.text*)board/samsung/ok6410a/lowlevel_init.o (.text*)board/samsung/ok6410a/bl2_mmc_copy.o (.text*)}
  • arch/arm/lib/sections.c
char __image_copy_start[0] __attribute__((section(".__image_copy_start")));
问题
问题:relocate 的目标地址 0x0000 0000 在哪里?A 还没解决的问题relocate 之后,如果异常发生, 0x0000 0000 中的 每一个 入口指令是不是 会 地址相关?arm-linux-gnueabi-objdump  -D  u-boot > u-boot.dis 之后1.还没解决的问题发现 b reset 反汇编 为 b   5fb00300一旦reset异常发生,PC = 0x00000000此时 0x00000000 中 是 b reset 吗???linux 和 u-boot 也一样, 0x00000000 也写入了指令为什么 在linux管理时 reset 的时候,还是要执行 u-boot 呢?2. 已经解决的问题发现 ldr pc, _undefined_instruction 反汇编 为 ldr pc, [pc, #20]看起来 b reset 在 reset异常发生时没问题按道理来讲_undefined_instruction异常发生时,就会有问题,因为跳转的地址与pc相关之所以没发生问题,是因为做了fixloop对以下732bit做了fixloop,更改了以下732bit的值_undefined_instruction: .word undefined_instruction // 占用1个32bit_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq// 第一个32bit ,更改为重定位过后 undefined_instruction 的地址// ldr pc, [pc, #20]的时候,pc中的值为重定位过后的函数的值,就不会出现问题了以上分析的详细过程原型 请参考 https://blog.csdn.net/u011011827/article/details/115241203

这篇关于OK6410A 开发板 (三) 13 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析2 relocate_vectors的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决