位置無關碼的理解和使用

1.

位置無關碼:CPU取指時用相對地址取指令(比如pc +4),只要其相對地址沒有變,都能夠取指並運行。

位置相關碼:利用絕對地址取指並運行,這就需要你存放程序(鏈接過程中)需要按照連接腳本的要求那樣執行(Makefile裏面有 -Ttext xxx指定或連接腳本)。


2.

對於ARM啓動流程,一般先將BL1下載到ROM的0地址去運行,再將整個bootloder複製到DDR中去運行,一般境況下兩者的地址並不相同,程序在SDRAM中的地址重定位過程必須由程序員來完成。這樣就有了位置無關代碼的概念,指代碼不在連接時指定的運行地址空間,也可以執行,它一段加載到任意地址空間都能執行的特殊代碼。這樣在steppingstone設計的代碼要用位置無關設計(BL1不知道自己會在哪運行)。 


3.

位置無關碼的應用:

1). 程序在運行期間動態加載到內存;  
2). 程序在不同場合與不同程序組合後加載到內存(共享的動態鏈接庫);  

3). 在運行期間不同地址相互之間的映射(如bootloader)


4.

使用mov pc ,xxx ;  ldr pc ,xxx等就是位置相關碼。這些使用絕對指令尋址。


而使用bl ,b ,adr,ldr一般爲位置無關碼。


在使用b, bl調用C語言中的函數裏不要使用全局變量,因爲C中全局變量的地址也是根據鏈接地址生成的。



參考:http://www.cnblogs.com/mylinux/p/5577472.html





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章