u-boot中地址问题

1、什么是编译地址?什么是运行地址?

32 位的处理器,它的每一条指令是4 个字节,以4 个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么

跳转,它会顺序进行执行,编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称

之为编译地址。 运行地址是指,程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里,哪里就是运行的

地址。比如有一个指令的编译地址是0x5,实际运行的地址是0x200,如果用户将指令烧到0x200 上,那么这条指令的运行地址

就是0x200,当编译地址和运行地址不同的时候会出现什么结果?结果是不能跳转,编译后会产生跳转地址,如果实际地址和编

译后产生的地址不相等,那么就不能跳转。C语言编译地址都希望把编译地址和实际运行地址放在一起的,但是汇编代码因为不

需要做C 语言到汇编的转换,可以人为的去写地址,所以直接写的就是他的运行地址,这就是为什么任何bootloader刚开始会有

一段汇编代码,因为起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。编译地址和运行地址如何

来算呢?假如有两个编译地址a=0x10,b=0x7,b的运行地址是 0x300,那么a的运行地址就是 b的运行地址加上两者编译地址

的差值,a-b=0x10-0x7=0x3,a的运行地址就是0x300+0x3=0x303。 假设uboot 上两条指令的编译地址为a=0x33000007 和

b=0x33000001,这两条指令都落在bank6 上,现在要计算出他们对应的运行地址,要找出运行地址的始地址,这个是由用户烧

录进去的,假设运行地址的首地址是0x0,则a的运行地址 为0x7,b为0x1,就是这样算出来的。

2、为什么要分配编译地址?这样做有什么好处,有什么作用?

比如在函数a 中定义了函数b,当执行到函数b时要进行指令跳转,要跳转到 b 函数所对应的起始地址上去,编译时,编译器

给每条指令都分配了编译地址,如果编译器已经给分配了地址就可以直接进行跳转,查找 b函数跳转指令所对应的表,进行直接

跳转,因为有个编译地址和指令对应的一个表,如果没有分配,编译器就查找不到这个跳转地址,要进行计算,非常麻烦。

3、运行地址和加载地址有什么区别呢?

加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。如果程序是在Flash里

运行,则运行地址和加载地址是相同的。如果程序是在RAM里运行,但程序是存储在Flash里,则运行地址指向RAM,而加载地址是指

向Flash。代码一般是烧写在NAND Falsh里面,比如S3C2440 如果开机从NAND Falsh启动 其开始的4K代码会被Copy到2440内

部的4KRAM用于对关键硬件的初始化这时候内部RAM被映射为0x0地址。如果从NOR Falsh启动,因为NOR Falsh支持片上运行,

代码可以直接在NOR Falsh上运行 此时NOR Falsh便被映射成0x0,S3C2440 内部的4KRAM便被映射到了0x40000000处。

4、什么是相对地址?

以NOR Flash为例,NOR Falsh是映射到bank0上面,SDRAM是映射到bank6上面,uboot和内核最终是在SDRAM上面运行,

最开始我们是从Nor Flash的零地址开始往后烧录, uboot中至少有一段代码编译地址和运行地址是不一样的,编译uboot 或内核

时,都会将编译地址放入到SDRAM 中,他们最终都会在SDRAM 中执行,刚开始 uboot 在Nor Flash 中运行,运行地址是一个

低端地址,是bank0中的一个地址,但编译地址是 bank6 中的地址,这样就会导致绝对跳转指令执行的失败,所以就引出了相对

地址的概念。那么什么是相对地址呢?至少在bank0 中uboot这段代码要知道不能用 b+编译地址这样的方法去跳转指令,因为这

段代码的编译地址和运行地址不一样,那如何去做呢?要去计算这个指令运行的真实地址,计算出来后再做跳转,应该是 b+运行

地址,不能出现b+编译地址,而是 b+运行地址,而运行地址是算出来的。

时间: 2024-08-01 13:00:14

u-boot中地址问题的相关文章

SpringBoot(三) :Spring boot 中 Redis 的使用

前言: 这一篇讲的是Spring Boot中Redis的运用,之前没有在项目中用过Redis,所以没有太大的感觉,以后可能需要回头再来仔细看看. 原文出处: 纯洁的微笑 SpringBoot对常用的数据库支持外,对NoSQL 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,

springboot(三):Spring boot中Redis的使用

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化. redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库.可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景.本文介绍Redis在Spring Boot中两个典型的应用场景. 如何使用 1.引入

springboot(十一):Spring boot中mongodb的使用

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,感兴趣的可以看看这篇文章:场屠戮MongoDB的盛宴反思:超33000个数据库遭遇入侵勒索,同时也说明了很多公司生产中大量使用mongodb. mongodb简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大&qu

Spring Boot中使用Swagger2构建API文档

程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码,接口调用方的抱怨声不绝于耳.而程序员是最擅长"偷懒"的职业了,自然会有多种多样的自动生成文档的插件.今天要介绍的就是Swagger. 接下来我们在Spring Boot中使用Swagger2构建API文档 Swagger是一个简单但功能强大的API表达工具.它具有地球上最大的API工具生

Spring Boot中Redis的使用

软件152   高光顺 redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库.可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景.本文介绍Redis在Spring Boot中两个典型的应用场景. 如何使用 1.引入 spring-boot-starter-redis <depe

记一次spring boot中MongoDB Prematurely reached end of stream的异常解决

在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb.UncategorizedMongoDbException: Prematurely reached end of stream; nested exception is com.mongodb.MongoSocketReadException: Prematurely reached end o

企业分布式微服务云SpringCloud SpringBoot mybatis (十七)Spring Boot中的事务管理

快速入门 在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager.所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用. 我们以之前实现的<用spring-data-jpa访问数据库>的示例Chapter3-2-2作为基础工程进行事务的使用常识

企业分布式微服务云SpringCloud SpringBoot mybatis (十六)Spring Boot中使用LDAP来统一管理用户信息

LDAP简介 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化.目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力.目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略.而目录服务的更新则一般都非常简单.这种目录可以存储包括个人信息.web链结.jpeg图像等各种信息.为了访问存储在目录中的

Spring Boot中Starter是什么

比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依赖. 经过研究,Starter主要用来简化依赖用的.比如我们之前做MVC时要引入日志组件,那么需要去找到log4j的版本,然后引入,现在有了Starter之后,直接用这个之后,log4j就自动引入了,也不用关心版本这些问题. 部分starters的依赖: Starter(Group ID: org.

Spring boot中使用log4j

我们知道,Spring Boot中默认日志工具为logback,但是对于习惯了log4j的开发者,Spring Boot依然可以很好的支持,只是需要做一些小小的配置功能.Spring Boot使用log4j只需要一下几步 引入log4j依赖 在创建Spring Boot工程时,我们引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架Logback,所以我们在引入log4j之前,需要先排除