ARM Architecture C 语言寻址解析——
从U-Boot relocation所展开的探索(一)
从U-Boot relocation所展开的探索(一)
by
蔡于清
文章的名字有点长也有点拗口,但它却很好的表达了本文的主题和来历。这个主题将讨论和分析ARM架构上C语言对变量和函数的寻址方式,为什么要讨论这个主题?或者说为什么会想到去讨论这个主题?答案就在文章的副标题,没错,因为U-Boot。这段时间本人在移植U-Boot2011.12到自家的OMAP3平台上,早在ARM9时代就接触过U-Boot,当时没有仔细研究,兴趣所致,这次我读起了她的源代码,其中有一个特性引起我的注意,这个特性就是同一份U-Boot代码被加载在不同的内存空间运行,简单说就是U-Boot的运行基地址可以不同于其连接基地址(比如连接时指定的基地址处于Flash空间而运行时基地址处在RAM空间),这就带来一个问题——”CPU如何进行寻址?“。对于一个普通的完整的可运行的bin 文件,必须在生成它的时候(一般是在link阶段)指定其连接基地址,一般而言连接基地址等同于运行基地址(也等同于加载地址),如果运行地址与连接地址不同,则寻址必将发生错误,而U-Boot却可以被整体的从一个内存段搬运到另一个内存段,并顺利地运行,她是如何做到的呢?——答案是relocotion(重定位),那么U-Boot又是如何进行relocation的呢?好奇心的驱使,我决定弄个明白,于是就有了这个主题——ARM寻址解析。
这个主题分三个部分讲解(每一部分单独成章,本文为第一章):
- ARM Architecture C语言寻址方式解析(GNU ARM Tool Chain with No PIC compile option)。
- ARM Architecture C语言寻址方式解析(GNU ARM Tool Chain with PIC compile option)。
- U-Boot Relocation解析。
本系列文章使用如下工具和源码:
- host ÿ