ARM裸板程式中為什麼要使用重定位

2021-08-17 04:49:14 字數 885 閱讀 8909

重定位一般有兩個目的:

①、程式檔案過大,這時候需要把超出儲存器(norflash或sram)部分的**,「放到」(也即重定位)sdram中去執行;

②、程式燒寫在norflash並且使用了全域性變數。

這篇文章著重解析第二個目的,對於第乙個目的後續有時間再寫。

如果你的程式是燒寫在norflash中,並且程式裡使用了全域性變數(不包括靜態全域性變數,下同),那麼你就需要重定位了。為什麼?

因為:①、全域性變數是儲存在程式檔案裡的

②、norflash可以像sram一樣讀資料,但是不能像sram簡單地寫資料

所以程式執行時可以讀取這個全域性變數,但是不能寫這個全域性變數,因為該全域性變數儲存在norflash裡面。

這時候重定位就派上用場了,用通俗易懂地描述這個過程:

假設你的全域性變數位於程式中0x800的位置,那麼程式在使用這個全域性變數前,就需要把所有的全域性變數「對映」到sdram那邊過去,包括全域性變數的初始值都「對映」過去,然後後續程式使用這些全域性變數的時候,全部都在sdram那邊訪問、讀、寫。

這裡面就涉及到兩個概念:

①、執行位址(又稱鏈結位址、重定位位址、runtimeaddress)

②、載入位址(又稱儲存位址、loadaddress)

執行位址也即是程式執行時實際上所指向的位址,而載入位址指**所儲存的位址。

假設某個變數的:

執行位址=0x3000 0000

載入位址=0x800

那麼就是該變數是儲存在程式中0x800的位置,但是執行的時候,要訪問的話,就要到0x30000000的地方去訪問、讀和寫

所以我們的全域性變數重定位時,就要把執行位址設定在sdram的位址(0x3000 0000),而載入位址並不固定,它緊隨著程式.text段放置。

以上是重定位的簡單介紹

C 中為什麼要使用斷言

斷言assert是僅在debug下有效的巨集,當其中的條件為假時,觸發錯誤提示。使用斷言的目的是捕捉不應該發生的非法情況。注意 不要混淆非法情況與錯誤情況之間的區別,後者的出現是因為 錯誤,是一定要作出處理的。如何使用 1 在函式的入口處,使用斷言檢查引數的有效性 合法性 2 在編寫函式時,要進行反...

React中為什麼要使用immutableJs

當父元件讀取子元件資料form,賦值給obj,然後對obj進行一些修改過程中,直接賦值就是淺拷貝,修改obj之後會影響form物件,也就會影響子元件中的form的值,這也就是js中的隱患,在react中向上層元件或者下層元件傳遞物件,很難保證這個物件是否會被修改,當不希望對form產生影響的時候,需...

java中為什麼要使用迭代器

迭代模式是訪問集合類的通用方法,只要集合類實現了iterator介面,就可以用迭代的方式來訪問集合類內部的資料,iterator訪問方式把對不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到迴圈遍歷集合的效果。例如,如果沒有使用iterator,遍歷乙個陣列的方法是使用索引 ruby f...