Tiny4412裸机程序之代码重定位初体验

发布者:快乐球球最新更新时间:2022-02-18 来源: eefocus关键字:Tiny4412  裸机程序  代码重定位 手机看文章 扫描二维码
随时随地手机看文章

从前面一节Exynos 4412的启动过程分析 ,我们知道:一上电,exynos4412首先执行固化在IROM中的代码,iROM首先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动PLL等 ),然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/其他 ),把 BL1从里面读出存入iRAM的0x02021400地址处,最后启动 BL1; BL1从SD卡适当的位置读入14K 字节的数据,存在iRAM地址0x02023400处,所以BL2不能大于(14K – 4) 字节,这里引出了为什么写这一节的原因:如果我们的程序很大,大于14K怎么办????


下面我们先来介绍两个概念:

一是程序当前所处的地址,即程序在运行时,所处的当前地址;二是程序的链接地址,即程序运行时应该位于的运行地址。编译程序时,可以指定程序的链接地址。


什么是重定位

对于Tiny4412而言,前面我们已经说过:启动时BL1只会从sd等启动设备中拷贝14K的代码到IRAM中,那么当我们的程序超过14K怎么办?那就需要我们在前14K的代码中将整个程序完完整整地拷贝到DRAM等其他更大存储空间,然后再跳转到DRAM中继续运行我们的代码,这个拷贝然后跳转的过程就叫重定位。


本章中我们主要学习如何重定位,但是并不会涉如何使用到DRAM,而是简单地将代码从IRAM的0x02023400处拷贝到IRAM的0x0202a000处,然后跳转到0x0202a000处继续运行我们的代码。


一、程序说明

基于上一个实验的代码进行修改,修改了start,S文件以及链接脚本文件:

在start.S文件中增加如下代码:



.text

.globl _start

_start:

 

/* 关闭看门狗 */

ldr r0, =0x10060000

mov r1, #0x0

str r1, [r0]

 

/* 启动Icache */

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, #0x00001000 //打开ICache

//bic r0, r0, #0x00001000 //关闭ICache

mcr p15, 0, r0, c1, c0, 0

 

/* 重定位 - 将代码从0x02023400处拷贝到链接地址0x0202a000处(在链接脚本里指定的),并跳转到这个地址去执行 */

adr r0, _start /* adr指令用于读取_start在当前的运行的物理地址,即0x02023400 */

ldr r1, =_start /* 读取_start的链接地址,即0x0202a000 */

ldr r2, =bss_start /* 读取bss段的起始地址,用于计算需要拷贝的字节多少 */

cmp r0, r1

beq clean_bss /* 如果r0=r1,则跳转到clean_bss,说明此时已经在链接地址处了 */

 

/* 如果r0!=r1,则进行如下的拷贝 */

copy_loop:

ldr r3, [r0], #4 /* 源 */

str r3, [r1], #4 /* 目的 */

cmp r1, r2 /* 判断是否已经拷贝完 */

bne copy_loop /* 如果没有拷贝完就继续拷贝 */

 

/* 清bss段 */

clean_bss:

ldr r0, =bss_start /* r0保存bss段的起始地址 */

ldr r1, =bss_end /* r1保存bss段的起始地址 */

cmp r0, r1

beq run_on_dram /* 如果r0=r1,则跳转到run_on_dram,说明bss段里边没有变量 */

mov r2, #0

clear_loop:

str r2, [r0], #4

cmp r0, r1

bne clear_loop

 

ldr sp, =0x02060000 

 

/* 跳转 */

run_on_dram:

ldr pc, =main /* 执行完这句话之后,PC就指向了main的链接地址 */


这段代码主要实现了代码重定位、清除BSS段、以及跳转到链接地址继续运行,注释说的已经很明白了,有什么的不熟悉的,大家可以留言共同探讨。


链接脚本reload.lds修改为如下:


SECTIONS {

. = 0x0202A000;

.text : { 

*(.text) 

}

.rodata ALIGN(4) : {

*(.rodata*)

}

.data ALIGN(4) : { 

*(.data*) 

}

bss_start = . ;

.bss ALIGN(4) : { 

*(.bss) *(COMMON) 

}

bss_end = . ;

}


主要增加了bss段的起始bss_start及结束bss_end 的定义,这两个标号在start.S中被用到。


二、编译、烧写、运行

1.编译

通过FTP或者其他工具将文件上传到服务器上去,输入make命令进行编译将得到reload.bin文件。

2.烧写

将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:


sudo ./sd_fusing.sh /dev/sdb ../8_reload/reload.bin


将SD卡插入Tiny4412开发板,上电,你会看到和上一节的运行效果一样(因为我们没有修改LED的显示效果,只是修改了程序的运行地址,这个对外是看不出区别的)。


三、反汇编文件分析

将反汇编文件reload.dis,从服务器上下载下来,我们进行简单分析一下:

155713_4AHc_2888084.png

从上图可以看出,程序的链接地址确实是我们在连接脚本里指定的0x0202a000

160248_xR3t_2888084.png

我们再来看看跳转的那条指令;


202a060: e59ff010 ldr pc, [pc, #16] ; 202a078

将当前PC的值加上24后的地址的内容赋给PC,即:


0x202a060 + 8 +16 = 0x0202a078

将0x0202a078这个地址的值赋给PC


160549_gx0J_2888084.png

0x0202a0b0这个地址正是main函数的入口地址。


我在自己的开发板上面试验成功。有兴趣的小伙伴可以自行试验。

关键字:Tiny4412  裸机程序  代码重定位 引用地址:Tiny4412裸机程序之代码重定位初体验

上一篇:Exynos4412 文件系统制作(三)—— 文件系统移植
下一篇:TINY4412 裸机程序之点灯

推荐阅读最新更新时间:2024-11-07 16:38

Exynos4412裸机程序之DDR工作原理与时序(二)
Tiny4412和PC互传文件方法: 将编译好的可执行文件下载到目标板目前主要4种方式: 第一种:通过ftp传送文件到开发板(推荐使用) 第二种:复制到介质(如优盘) 第三种:通过串口传送文件到开发板 第四种:用nfs文件系统作为根文件系统启动 下面分别进行介绍: 1、使用ftp传送文件(推荐使用): 说明:使用ftp登录目标板,把编译好的程序上传;然后修改上传后目标板上的程序的可执行属性,并执行。 首先,在PC端执行,如下所示: ftp 192.168.48.151 用户名:plg 密 码:plg 设置文件传送格式:bin 传送hello文件 :put hello 退出登录 :by 然后,在目标板一端执行,
[单片机]
Eclipse开发调试ARM裸机程序(三)C语言LED_LINUX使用DNW
第二个程序用C语言实现的LED程序,Startup.S是启动代码;led_on_c.c是C语言实现的LED点灯程序。代码分别如下: @ @ File:Startup.S @ 功能:通过它转入C程序 @ .text .global _start _start: ldr r0, =0x56000010 @ WATCHDOG寄存器地址 mov r1, #0x0 str r1, @ 写入0,禁止WATCHDOG,否则CPU会不断重启 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
[单片机]
Eclipse开发调试ARM<font color='red'>裸机</font><font color='red'>程序</font>(三)C语言LED_LINUX使用DNW
Tiny4412裸机程序之操作ICache
一、首先普及一下什么是Cache 基于程序访问的局限性,在主存和CPU通用寄存器之前设置了一类高速的、容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU之间的高速小容量存储器称作高速cache。比较常见的cache包括icache和dcache。 icache的使用比较简单,系统刚上电时,icache中的内容是无效的,并且icache的功能是关闭的,往CP15协处理器中的寄存器1的bit 写1可以启动icache,写0可以停止icache。icache关闭时,CPU每次取指都要读主存,性能非常低。因为icache可
[单片机]
mini2440裸机程序--LED灯(C语言)
看了mini2440配套光盘里面的例子,C语言的点亮LED程序略显复杂。当时打开工程,看到这么多文件,顿时傻了眼。还好自己能够有良好的心态,慢慢弄。 对于点亮LED灯的C语言程序,相对于汇编程序,除了MDK系统自动添加的启动代码S3C2440.S ,其余的也就和汇编程序的步骤一样了。现在就把程序附在下面: #define rGPBCON (*(volatile unsigned long *)0x56000010) #define rGPBDAT (*(volatile unsigned long *)0x56000014) #define rGPBUP (*(volatile unsigned long *)0x5
[单片机]
TX2440裸机程序-uart
一、uart原理简介 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送。 它的特点是:传输速度快,是用于短距离通信; §串行通信:利用一条数据线将数据一位位地顺序传送。 特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信。 异步通信: ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的。 ª通信协议:是指通信双方约定的一些规则。在异步通讯时,对数据格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。 起始位:先发一个逻辑“0”信号,表示传输字符的开始;
[单片机]
TX2440<font color='red'>裸机</font><font color='red'>程序</font>-uart
【ARM裸板】内存控制器、SDRAM基础与代码定位
1.CPU如何控制外设? CPU控制相应外设的寄存器,有外设控制器发出特定的波形 2.CPU如何选择寄存器? CPU通过内存控制器选择 发出地址addr 根据地址选择不同的模块 CPU 内存控制器 读写数据 3.外设共用地址、数据总线,如何互不干扰? 通过片选CS引脚,选择不同的外设 4.谁控制片选引脚 发出地址addr 根据地址发出片选信号 CPU 内存控制器 使能相应的外设 由芯片手册得知:当CPU发出地址是0x00000000时 nGCS0为低电平选择(有效) 5.CPU如何读写数据的方向? 通过外设芯片的读写引脚控制 6.CPU不同位宽设备如何连接并读取数据【内存控制器】 6.1 连接方式 8bit ROM
[单片机]
【ARM裸板】内存控制器、SDRAM基础与<font color='red'>代码</font><font color='red'>重</font><font color='red'>定位</font>
[ARM裸机程序][8]ARM处理器启动流程(S3C2440)
ARM处理器启动流程 S3C2440支持启动方式: 1. NorFlash启动 2. NandFlash启动 当处理器上电时,会自动从0地址处取第一条指令开始运行。左边为当选择NorFlash启动时地址的布局,右边为当选择NandFlash启动时地址的布局。 NandFlash不像NorFlash一样参与统一编址,CPU不能直接访问其内容。NandFlash启动模式时,0地址处为Boot SRAM片内RAM大小4KB,Boot SRAM也称stepping stone。CPU上电后第一条指令从stepping stone获取,CPU会提前把NandFlash最前端的4KB内容复制到stepping stone(硬件自动完成)。
[单片机]
[ARM<font color='red'>裸机</font><font color='red'>程序</font>][8]ARM处理器启动流程(S3C2440)
第一章、Tiny4412 U-BOOT移植一 说明
一、移植前说明: 1、 特别声明:此文档是我的学习文档,里面肯定有错误地方,仅供参考! 2、移植平台:友善之臂Tiny4412SDK1306平台。 3、移植系统:Ubuntu12.04 4、移植原始CODE:平台光盘中由Samsung提供的U-Boot-samsung-dev.tar.bz2。为什么用这个,只能说因为我也菜鸟,我找了u-boot官网最新的代码看了一下,我没有在boardsamsung目录下找到与Exynos4412芯片很相关的平台目录,估计是有的,只是由于我很菜,不清楚是那一个,为了省自学时间,还是用三星提供的U-Boot源码。 5、参考文档:各相关手册,主要手册是Exynos4412 RISC Microproc
[单片机]
第一章、<font color='red'>Tiny4412</font> U-BOOT移植一 说明

推荐帖子

谁有 at89s51实验板的资料啊?
朋友给我一个是实验板子,上面接了好多元件,6个数码管,步进机,A/D转换器,4*4键盘..液晶显示,可都不知道这些元件是怎么接到那些引脚上的,原来写的程序也不知道要怎么改.....谁有at89s51实验板的资料啊?可都不知道这些元件是怎么接到那些引脚上的,不同的器件设计有不同的通信接口,以及自身的操作方式.这才能用起来.最好有原理图在,不然的话就要麻烦些...但是,也不是说不能办事.万用表啥的,总有吧?呵呵举个例子:6个数码管你要看一个它的显示方式,是动态显示还是静态显示.(不
kids85 嵌入式系统
新产品快递High-Side Current Monitors Simplify Measurement at High Voltage
Diodes’High-SideCurrentMonitorsSimplifyMeasurementatHighVoltageDiodesIncorporatedhasintroducedafamilyof6highreliabilitycurrentmonitorsfor40Vand60Voperation.TheZXCT108Xdevicesdetectcurrentinahighsidesens
安_然 模拟电子
WindRiver 2000万美元收购移动软件公司
WindRiver系统公司日前宣布,WindRiver将通过现金和股票的形式,以2000万美元的价格收购InterpeakAB公司。InterpeakAB公司是网络、安全以及移动中介软件的领导供货商,其中间件软件可使新一代设备安全地连接至互联网。这项收购案将为WindRiver系统公司注入高品质安全网络技术,进一步扩大其设备软件平台的版图,同时强化其为设备制造商提供更高的平台扩充性、安全性与关键认证支持的能力。WindRiver公司主席、董事长、首席执行官KenKlein认为,W
rain 单片机
最新版的TivaWare_C_Series-2.0.1.11577出来了
俺刚装的这个版本软件,但不知道是否有所提高,然而在dk-tm4c123g增加了新的例程,俺原来装的是1.0版的 最新版的TivaWare_C_Series-2.0.1.11577出来了固件库增加超过250页,改动不能说不大固件库增加超过250页奈斯~~~在哪下载啊。。。给个链接。。。最好还是不用,时钟配置都有BUG。。。。。大家觉发表于2014-7-1710:08最好还是不用,时钟配置都有BUG。。。。。 应该会有改进的,有bug不可怕,怕的是不知道
平湖秋月 微控制器 MCU
430F169AD采样工作有间断期
#includemsp430x16x.h#defineNum_of_Results8uintADC_BUF0;uintADC_BUF1;uintsumI;//定义电流采样均值uintsumV;//定义电压采样均值//***************************主程序*****************************************voidmain(void){WDTCTL=WDTPW+WDT
dearestwsc 微控制器 MCU
ARM 嵌入式main()的运行过程
刚入手嵌入式,看了一些资料,有一点不是很明白,就是在做完初始化init.s的操作之后,系统转入main()入口,那么这之后系统是如何捕获消息并触发相应的时间的??应该在哪写这些代码呢??ARM嵌入式main()的运行过程看不明白楼主的意思,帮你顶一下吧!裸机程序??裸机的话就跟单片机一样的,别告诉我没学过单片机啊!!!呵呵就是说正常的程序是从第一句执行到最后一句,那么进入main()后像捕获键盘消息的操作和处理过程应该怎么写???还真没学过单片机,公司临时项目,没搞这方面
hehewyx ARM技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved