【裸机开发】镜像文件内部信息构成

news2024/11/28 12:43:25

由于当前使用的是裸板,没有OS,DDR的初始化、文件保存地址都尚未确定,所以我们生成二进制文件以后,是无法直接放到开发板上运行的。

因此,我们一般会在二进制文件之前加一些头部信息,这些头部信息会告诉开发板如何初始化DDR、文件要拷贝到哪个位置、文件大小是多少等。头部信息 + 二进制文件 = 镜像文件

下面重点了解的是头部信息由哪些内容构成


目录

一、IVT

1、IVT 的起始位置

2、IVT 的内容

二、Boot Data

1、Boot Data 的起始位置

2、Boot Data 的内容

三、DCD

1、DCD 的起始位置

2、DCD 的内容

四、用户代码(二进制文件)


一、IVT

IVT 相当于当前镜像文件的管理者,指定了 IVT、Boot Data、DCD、bin文件在DDR中的起始位置

1、IVT 的起始位置

采用不同设备启动,IVT 在存储设备中偏移量也会有所不同,以SD卡为例,IVT表的偏移量是 1K 字节,说明 IVT 要保存到第 1Kbyte 的位置

2、IVT 的内容

那么 IVT 中主要包含了如下内容:

字段含义示例数据
header头部信息(如 IVT 所占空间大小、版本)0x402000D1
entry

镜像第一行指令在内存中的绝对地址

(不是存储设备的绝对地址)

0x87800000
reserved1保留字段-
dcdDCD地址(指的是内存中的地址)0x877FF42C
boot databoot data 地址(内存地址)0x877FF420
selfIVT 复制到 DDR 中以后的首地址0x877FF400
csfCSF 地址0x00000000
reserved2保留字段-

首先看的是head,header的数据是 0x402000D1,第二三字节表示的是 IVT 大小,可知这里的 IVT 大小为 32 字节。

然后看的是 self,self 表示 IVT 加载到DDR的首地址,前面已知 IVT 大小为 32 字节,那么跟在IVT 后面的 boot data 的首地址为 self + 0x20 = 0x877FF400 + 0x20 = 0x877FF420

接下来再看 boot data,和上面推算的一样,首地址为 0x877FF420

二、Boot Data

Boot Data 保存的内容主要是和镜像文件有关,这里说的镜像文件 = 1K偏移 + IVT + Boot Data + DCD + bin文件,比如镜像文件在DDR中的起始位置、镜像文件的大小等。

1、Boot Data 的起始位置

其实从上一部分可以知道,Boot Data 的首地址为 0x877FF420

2、Boot Data 的内容

Boot Data 包含的内容主要是从整个镜像文件的角度来看的

字段含义示例数据
start

整个镜像文件(1K偏移 + IVT + Boot Data + DCD + bin文件)在内存中的起始位置

0X877FF000
length 整个镜像文件的大小 = 1K偏移 + IVT + Boot Data + DCD + bin文件,最大为 2M byte0X00200000
plugin插件0X00000000

三、DCD

DCD,Device Config Data,开发板刚上电的时候,imx6ull 内寄存器的值都是一些默认值,这些值可能不是我们想要的。为此,我们可以在DCD中添加一些寄存器的配置信息,每一个寄存器对应着一个初始值。

  • xxx 寄存器:初始值
  • xxx 寄存器:初始值

这样的话,开发板在上电时会读取这些信息并对寄存器做相应的初始化,如开启某些外设的时钟初始化DDR等。

1、DCD 的起始位置

Boot Data 的每个字段 4 个字节,所以 Boot Data 占12个字节,因此DCD的起始位置为 0x877FF420 + 0x0C = 0x877FF42C

2、DCD 的内容

DCD 也包含了头部,但是没有固定大小,最大不能超过 1768 字节。格式比较麻烦,层层套娃。整体格式如下:

其中CMD的格式如下。

  • Tag 为单字节,固定是 0xCC
  • Length 是两个字节,表示写入的命令数据长度(包含 header),大端模式
  • Parameter 为一个字节,结构如下,具体作用参考 《imx6ull参考手册》的8.7.2 

  • Address:要初始化的寄存器地址
  • Value/Mask:相应的寄存器的值

四、用户代码(二进制文件)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xsync集群分发脚本

脚本: #!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] thenecho Not Enough Arguement!exit; fi #2. 遍历集群所有机器 for host in hadoop02 hadoop03 doecho $host #3. 遍历所有目录,挨个发送for file in $do#4. 判断文件是否存在if [ -e $file ]th…

文本三剑客awk:命令讲解

awk-命令讲解: 一、awk: 1.定义: (1)在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔。并按模式或者条件执行编辑命令…

006-从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址:https://gitee.com/csps/mingyue 文档地址:https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

步进电机基本原理及驱动方式详解

步进电机基本原理及驱动方式详解 步进电机相关概念基本原理类型和结构转子结构定子结构 励磁方式ATD9800 驱动使用实例 参考文献 步进电机相关概念 步进电机是一种常用于控制和定位应用的电动机,其独特的工作方式使其在许多领域中都具有广泛的应用。步进电机以其 精…

正态总体下常见的抽样分布

1.正态总体下常见的抽样分布 本人博客:总体分布、样本分布、抽样分布的区别 本人博客:三大抽样分布 正态总体下常见的抽样分布意思是:样本来自服从正态分布的总体中,从样本中抽样后得到的分布 1.1 单个正态总体下的抽样分布&…

【高危】GitLab CE/EE 存在存储型XSS漏洞

漏洞描述 GitLab 是一款基于Git的代码托管、版本控制、协作开发平台。 在 GitLab CE/EE 15.11 至 15.11.6 版本以及 16.0 至 16.0.1 版本中,当GitLab导入GitHub仓库时,如果GitHub仓库中包含由用户构造的恶意JavaScript代码的标签颜色,解析这…

为什么说程序员和产品经理一定要学一学PMP

要回答为什么说程序员和产品经理一定要学一学PMP?我们得先看一下PMP包含的学习内容。PMP新版考纲备考参考资料绝大多数涉及IT项目的敏捷管理理念。主要来源于PMI推荐的10本参考书: 《敏捷实践指南(Agile Practice Guide)》 《项目…

Java匿名内部类、invoke方法、动态代理

一、匿名内部类 匿名内部类一般作为方法的参数,这个方法的形参为接口,而实参为匿名内部类(可以理解为接口的对象)并且重写了接口中的方法。 例如: 定义了一个接口Star: 类型为Star的引用数据类型作为方法s…

关于docker中Nacos启动成功访问不了的情况

书接上回,这段时间在忙学成在线的微服务项目,上次出现了IP修改的问题,有了一定的解决方案,复制别人的虚拟机后如何修改IP_SSSEdward的博客-CSDN博客。 这次docker正常启动了,但是出现了访问不了的情况,但是…

短视频矩阵系统源码打包附赠分享

矩阵系统源码主要有三种框架:Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架,提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架,用于将数据模型、Web应用程序的用户界面和控制器逻…

【备战秋招】Java异常处理

Java程序在执行过程中所发生的异常事件可分为两类: Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源 耗尽等严重情况。 比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。 Exception: 其它因编程错…

使用pytorch进行FFT和STFT

首先,我们定义一个波形,幅值分别为20和38,频率为2和13: y 20 sin ⁡ ( 2 π 2 x ) 38 sin ⁡ ( 2 π 13 x ) y20 \sin (2\pi \times 2x)38\sin (2\pi \times 13x) y20sin(2π2x)38sin(2π13x) 采样频率为200Hz,采…

十四届蓝桥杯省赛CB

hinhin可否不要老&#xff0c;令创新高 A 日期统计B 01 串的熵C 冶炼金属D: 飞机降落E: 接龙数列F: 岛屿个数G: 子串简写H: 整数删除I: 景区导游J: 砍树 A 日期统计 #include <bits/stdc.h> using namespace std; #define int long long int #define pii pair<int,int…

VR云探校:解锁不一样的视角,“沉浸式”打卡校园

仲夏六月&#xff0c;又是一年高考时&#xff0c; 高考首战已经正式拉开帷幕&#xff0c; 超千万考生赴考&#xff0c;更有千万考生家长花式赴考。 少年的你披星戴月走过的路&#xff0c;终将会繁华遍地&#xff0c;今天VR全景就为千万考生和家长解锁不一样的视角&#xff0…

java观察者模式例子

观察者模式&#xff1a; 是一种常用的设计模式&#xff0c;它定义了一种一对多的关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象状态发生变化时&#xff0c;它的所有观察者都会收到通知并且自动更新。 在观察者模式中&#xff0c;主题对象通…

Minicap编译及简单使用

什么是MiniCap 官方说法&#xff1a;Minicap提供了一个套接字接口&#xff0c;用于从Android设备流式传输实时屏幕捕获数据。它旨在用作更大程序中的组件&#xff0c;因此仅凭其本身并不是非常有用。例如&#xff0c;它在STF中用于远程控制。 个人理解&#xff1a;Minicap是用…

如何检查 Android 设备是否支持 Widevine DRM

想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频&#xff1f;这是检查 Widevine DRM 支持的方法&#xff01; 许多流媒体服务&#xff0c;如 Netflix、Disney、Hulu 等&#xff0c;使用各种类型的数字版权管理 (DRM) 来保护其内容不被…

VulnHub项目:Hogwarts dobby

靶机地址&#xff1a;Hogwarts: Dobby ~ VulnHub 哈利波特也是初中时候最喜欢的电影~Dobby多比是马尔福加的奴隶精灵&#xff0c;出现在第二部密室中&#xff0c;后来被哈利波特的袜子所拯救&#xff0c;成为了一只快乐自由的小精灵&#xff0c;最后它在死亡圣器中&#xff0c…

keil从非0x08000000地址调试STM32单片机程序方法

在使用stm32单片机的串口IAP升级功能时&#xff0c;需要调试bootloader程序和app程序&#xff0c;一般bootloader的程序都是从0x08000000地址开始运行的&#xff0c;使用keil软件可以直接进行仿真&#xff0c;但是如果调试app程序的话&#xff0c;由于它不是从0x08000000地址开…

Java程序判断是否是回文

1 问题 利用java程序判断是否是回文。 2 方法 利用函数库&#xff0c;将输入的字符串倒置&#xff0c;看倒置后的字符串和原来的字符串是否一样&#xff0c;然后得出结论。 package practice; import java.util.Scanner; public class Huiwen { public static void main(St…