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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [