历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Exynos4412裸机程序之代码重定位初体验

发布者:馥睿堂 来源: eefocus关键字:Exynos4412  裸机程序  代码重定位 手机看文章 扫描二维码
随时随地手机看文章

从前面一节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文件中增加如下代码:

====================================================================

//重定位 - 将代码从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

 

// 跳转

run_on_dram:

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

====================================================================

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

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

====================================================================

SECTIONS {

    . = 0x0202a000;

    .text : {

        start.o

        * (.text)

    }

    .data : {

        * (.data)

    }

    

    bss_start = .;

    .bss : {

        * (.bss)

    }

    bss_end = .;

}

====================================================================

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

二、编译、烧写、运行

1.编译

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

2.烧写

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

1

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

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

三、反汇编文件分析

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

反汇编文件1

反汇编文件1

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

反汇编文件2

反汇编文件2

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

1

202a064: e59ff01c ldr pc, [pc, #28] ; 202a088

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

0x202a064 + 8 + 28 = 0x202a088

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

反汇编文件3

反汇编文件3

即PC指向0x0202a22c这个地址,我们继续往下看,发现:

反汇编文件4

反汇编文件4

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

 

上一张运行的图片:

运行效果

运行效果


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

上一篇:Exynos4412裸机SDRAM工作原理及时序分析
下一篇:Exynos4412裸机程序之操作ICache

推荐阅读

//对于多核可以参考三星官方提供的linux源码,uboot中只是用了单核。//下面代码只是用一个cpu核,采用SGI中断方式自己发自己收。#include "regs.h"void enable_mmu(unsigned long ttb);void init_ttb(unsigned long *ttb_base);void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);void memset(char *buf, char ...
当前,在汽车产业智能化、网联化、共享化的变革趋势下,智能网联汽车产业的发展受到行业内外的广泛关注。为帮助社会公众全面了解中国智能网联汽车产业技术发展,并为相关政府部门出台政策法规、研究机构和生产企业等制订战略规划和开展研究提供借鉴与参考,10月14日,由中国汽车工程学会、国汽(北京)智能网联汽车研究院有限公司组织智能网联汽车及相关行业...
由Palo Alto Networks(派拓网络)委托完成的一份全新报告显示:在中国,运动设备、桌面玩具和医疗可穿戴设备等联网设备通常会连接到企业的网络中,这促使相关技术部门领导提高警惕,并告诫企业需采取行动以免这些设备被利用进而危害企业网络。 这是根据全球网络安全领导企业Palo Alto Networks(派拓网络)委托完成的一项关于保护物联网(IoT)安全实...
一.硬件方案频率计由89S52单片机控制电路、信号处理电路、键盘电路以及测量数据的显示电路还有系统软件所构成的,在信号处理电路当中包含了待测信号放大、限幅、波形变换、波形整形以及分频电路。测量范围为0~100KHZ。主要由51单片机+最小系统+分频模块+整形模块+lcd1602液晶显示+按键而成;如图:二.设计功能(1)频率的测量范围为1Hz—100kHz能测量各种...

史海拾趣

问答坊 | AI 解惑

拆开ATX电源看优劣

用“忽如一夜春风来,千树万树梨花开”来形容现在市场上的电源绝不为过。面对着这些百花齐放的电源我们该做出怎样的选择呢?还是借用我们中国一句俗语叫“是骡子是马拉出来遛遛”。 首先我们来看一下ATX电源在电脑中所起的作用。从表面或简单点来讲 ...…

查看全部问答∨

430单片机的学习

先传一些430单片机常用的c语言程序集合吧!…

查看全部问答∨

请教usb蓝牙的兼容性问题

    环境:             (1).友善之臂公司提供的s3c2440板,及其usb蓝牙驱动(应该是wince自带的)。             (2).5种免驱的蓝牙适配器,都在winx ...…

查看全部问答∨

winCE下能否支持GBA游戏模拟器?

我之前开发了一款winCE5.0系统的PMP产品,我想在此基础上加入GBA游戏模拟器,然后通过TVout输出到电视机上,来玩一些GBA游戏,但不知怎样移植GBA模拟器到winCE5.0系统上,麻烦哪位高手提供一个思路或方法?谢谢 我目前的平台用的是ARM926双核的处理器,CP ...…

查看全部问答∨

PXA300开发板

售Marvell PXA300 开发板和提供PXA3XX方案…

查看全部问答∨

串口通讯 包头包尾

串口通讯中,包头和包尾的长度对数据传输有影响?长度如何定义?在线等ing…

查看全部问答∨

英文wince系统字体的问题

我配置了默认为英文版本的wince系统,烧写后系统里面有好些字体都是粗体的,比如菜单等。不知道有没有办法不要去掉粗体的效果?…

查看全部问答∨

请问wince6.0支持的.NET CF和SQL的版本是什么呢?

谢谢! 我最近一直被困在数据库开发这,老是出现can\'t find p/invoke dll:sqlceme30.dll 试过各种方法都不行,现在怀疑是不是wince6.0所支持的CF和SQL版本和我现在安的不一样才导致的错误。但没看到说wince6.0到底支持哪个版本的CF和SQL,倒是查 ...…

查看全部问答∨

跪求师傅帮忙画下电路原理图。

小弟第一次接触用MSP430单片机设计东西。 此次毕业设计是速度里程表。 小弟的原理框图如下, 求高手帮我画下电路图,…

查看全部问答∨

菜鸟求助大神点拨!!!

switch(__even_in_range(ADC10IV,12))  {    case  0: break;                          // No interrupt    ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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