搜索
bottom↓
回复: 25

arm的“位置无关码”中变量是怎么处理的?

[复制链接]

出0入0汤圆

发表于 2015-3-19 21:23:21 | 显示全部楼层 |阅读模式
本帖最后由 willX 于 2015-3-19 21:37 编辑

        最近看2440的引导代码,有个很大的问题,烦请大侠能指点迷津啊。

        2440的boot代码在上电初期是运行在芯片内部的SRAM里的,但boot代码的“链接地址”都不是0x00,所以在stepping stone中运行的代码需要“位置无关代码”用来确保程序跳转的正常执行。
       
现在问题来了,如果在汇编代码中调用C函数,该如何怎么实现“位置无关”这一功能?

我看韦东山的视频代码中是使用bl cfuntion,这样的代码。这样的C函数中的变量,是如何实现“位置无关”的呢?如果无法实现“位置无关变量”,这种C函数应该是无法正常执行的,所以应该可以实现这样的“位置无关C变量”,那么它的实现原理是什么呢?又该如何实现呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入31汤圆

发表于 2015-3-19 22:02:38 | 显示全部楼层
变量关系不大啊,不管是全局变量还是局部变量,都是放在ram里,只要ram正确初始化之后,就可以使用了,这个和代码位置无关差异很大

出0入0汤圆

发表于 2015-3-19 22:43:10 | 显示全部楼层
本帖最后由 Gallen.Zhang 于 2015-3-19 22:46 编辑

向你推荐PCtoLCD2002这款取模软件,支持任意字体,任意大小取模,取模方向可以设置,谁用谁知道。

不好意思,一不小心把另外一个帖子的回复到这个帖子来啦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-20 02:46:04 | 显示全部楼层
局部变量都放在栈里面的,自动浮动,即使不是“位置无关”的代码。

出0入12汤圆

发表于 2015-3-20 08:23:46 | 显示全部楼层
位置无关就是找一个寄存器来做 base,其他的变量或者函数都在这个 base 里面存一个地址,这样调用或者访问就是从数组里面取出地址再处理。

出0入0汤圆

 楼主| 发表于 2015-3-20 21:52:27 | 显示全部楼层
zchong 发表于 2015-3-19 22:02
变量关系不大啊,不管是全局变量还是局部变量,都是放在ram里,只要ram正确初始化之后,就可以使用了,这个 ...

变量在ram里没错,但是boot的阶段不同,定义的变量所在的位置也不同啊。
最初在2440的SRAM里,初始化SDRAM后relocate,变量经过clean_bss,变量就在SDRAM里了。

问题来了,SDRAM的变量可以通过lds文件指定地址,SRAM的变量没有指定(或者我现在不了解)怎么实现即在SRAM中运行(地址0x00~0x1000)又能在SDRAM里运行(地址0x30000000~0x34000000)呢?
变量的地址代码是怎么确定的呢?

出0入0汤圆

 楼主| 发表于 2015-3-20 21:54:59 | 显示全部楼层
aozima 发表于 2015-3-20 02:46
局部变量都放在栈里面的,自动浮动,即使不是“位置无关”的代码。

是这样的啊?!C子函数的所有局部变量都会压栈处理,然后运行吗?
如果是这样的话,自然可以不用考虑变量的“位置无关”性了。

出0入0汤圆

发表于 2015-3-20 22:16:39 | 显示全部楼层
感觉这个问题好高深的感觉,连看都没有看懂

出0入0汤圆

发表于 2015-3-20 22:24:03 | 显示全部楼层
abutter 发表于 2015-3-20 08:23
位置无关就是找一个寄存器来做 base,其他的变量或者函数都在这个 base 里面存一个地址,这样调用或者访问 ...

事情就是这样的,我去年一个项目中这么用的

出0入31汤圆

发表于 2015-3-20 22:41:42 | 显示全部楼层
willX 发表于 2015-3-20 21:52
变量在ram里没错,但是boot的阶段不同,定义的变量所在的位置也不同啊。
最初在2440的SRAM里,初始化SDRA ...

恐怕你的理解是有问题的
链接文件里的规定的存放全局变量的地址,你程序在ram中运行时,地址还是那个,不会变的,一般情况下这就要求你的程序在开始阶段首先要把sdram初始化好,然后才能把程序段和数据段复制到sdram中

出0入0汤圆

发表于 2015-3-21 09:06:21 来自手机 | 显示全部楼层
位置无关指的是前面的程序跳转采用相对跳转,所以这段程序不管是在sdram还是nor里面都可以正常运行

出0入0汤圆

发表于 2015-3-21 10:39:37 来自手机 | 显示全部楼层
对位置无关同感兴趣

出0入0汤圆

发表于 2015-3-21 11:42:03 | 显示全部楼层
编译成与位置无关,运行的时候再重新替换掉与位置相关的跳转

出0入0汤圆

发表于 2015-3-21 11:47:35 | 显示全部楼层
fshunj 发表于 2015-3-21 11:42
编译成与位置无关,运行的时候再重新替换掉与位置相关的跳转

感兴趣,求教C代码如何编译才是与位置无关?与位置有关?   

出0入0汤圆

发表于 2015-3-21 15:20:59 | 显示全部楼层
好像uboot也是这样的 ,吧uboot 搬运到内存任意位置后会重新定位运行位置。。
好像是 与编译器有关,gcc 支持这个 ,keil好像是不支持的

出0入0汤圆

发表于 2015-3-25 15:26:54 | 显示全部楼层
MDK可以使用编译指令--apcs /ropi/rwpi

出0入0汤圆

发表于 2015-3-26 10:10:12 | 显示全部楼层
PIC code是根据相对PC的偏移来对变量定址的。反汇编一段代码来看就很清楚了。

出0入12汤圆

发表于 2015-3-26 11:17:46 | 显示全部楼层
huangqi412 发表于 2015-3-21 11:47
感兴趣,求教C代码如何编译才是与位置无关?与位置有关?

看 U-Boot 的编译参数,-fPIC 之类的,然后看看 relocate_ram 怎么处理的。

不过需要注意,每一种构架多少有些不同。

出0入0汤圆

发表于 2015-3-26 12:31:39 | 显示全部楼层
编译器有位置无关配置项,配置好以后,所有的跳转,变量地址就会编译成相对地址,代码放到任何位置都可以运行

出0入0汤圆

发表于 2015-3-26 12:32:23 | 显示全部楼层
huangqi412 发表于 2015-3-21 11:47
感兴趣,求教C代码如何编译才是与位置无关?与位置有关?

mdk的话,c/c++选项卡里可以勾选 RO RW位置无关代码,ro就是代码,rw就是内存哦。。。而且据论坛里破解jlink v9同学的描述,升级文件直接下载到芯片里竟然也能正常运行可知,这个升级文件就是个位置无关代码了

其实产生位置无关确实挺有讲究,网上有讨论,我也不怎么明白

出0入0汤圆

发表于 2015-3-26 12:37:38 | 显示全部楼层
myxiaonia 发表于 2015-3-26 12:32
mdk的话,c/c++选项卡里可以勾选 RO RW位置无关代码,ro就是代码,rw就是内存哦。。。而且据论坛里破解jl ...

MDK 的 LINKER页面  make rw sections position independent之类么  
对这个感兴趣,想试试,有没进一步资料

出0入0汤圆

发表于 2015-3-26 12:38:57 | 显示全部楼层
abutter 发表于 2015-3-26 11:17
看 U-Boot 的编译参数,-fPIC 之类的,然后看看 relocate_ram 怎么处理的。

不过需要注意,每一种构架多 ...

这个东东是不是要看反汇编

出0入12汤圆

发表于 2015-3-26 12:45:18 | 显示全部楼层
huangqi412 发表于 2015-3-26 12:38
这个东东是不是要看反汇编

是的,因为他们都依赖于一个基本寄存器。

出0入0汤圆

发表于 2015-3-26 13:02:23 | 显示全部楼层
huangqi412 发表于 2015-3-26 12:38
这个东东是不是要看反汇编

我勾选了linker那里,但是无效,看mdk手册不清楚这里

但是在c/c++这里勾选是成功的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-26 13:17:14 | 显示全部楼层
看 gcc 怎么做的。
代码:
int variable;

void TestVar()
{
        variable = 0xAABBCCDD;
}
编译处理一下:arm-none-linux-gnueabi-gcc -S -Os -fPIC test.c
反汇编文件这样的:
TestVar:
        .fnstart
.LFB0:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
        ldr     r3, .L3
        ldr     r2, .L3+4
.LPIC0:
        add     r3, pc, r3
        ldr     r2, [r3, r2]
        ldr     r1, .L3+8
        str     r1, [r2, #0]
        bx      lr
.L4:
        .align  2
.L3:
        .word   _GLOBAL_OFFSET_TABLE_-(.LPIC0+8)
        .word   variable(GOT)
        .word   -1430532899

出0入0汤圆

发表于 2015-3-26 13:17:53 | 显示全部楼层
myxiaonia 发表于 2015-3-26 13:02
我勾选了linker那里,但是无效,看mdk手册不清楚这里

但是在c/c++这里勾选是成功的 ...


你试过了,勾选LINKER也不行,勾选C/C++页,生成BIN可以顺便在哪地址运行? 还有其他设置么
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 07:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表