主記憶體:配置、連結與分段
重定位(relocation)
想像把一整間書店搬到新的大樓。每個寫著「小說區在你右手邊 10 公尺」的內部指示牌都仍然有效,因為它是相對於你所站的位置寫的。但任何給出絕對房間號碼的牌子現在都錯了,必須更正。重定位就是調整程式,使得它的參考在被放到記憶體中新的起始位址後仍指向正確的地方。
具體來說,一個剛編譯好的程式還不知道它會住在哪裡,所以它含有許多假設起點為零(或被標記為「這需要修正」)的位址。當程式實際被放到例如實體 90000 時,所有那些內部位址都偏差了 90000。靜態重定位在載入時一次修正它:載入器走過一張重定位表,把每個被標記的位址加上 90000,把最終的數字烙進程式碼裡。動態重定位則什麼都不改寫;它讓程式維持邏輯位址,並在程式執行時讓硬體在每次記憶體存取時加上基底(這裡是 90000)——所以同一段程式碼在任何基底都能運作,甚至之後還能被移動。
為什麼重要:重定位讓程式具備足夠的位置無關性,能載入到任何有空閒 RAM 的地方,這在許多程式共用記憶體、以及某個行程必須被移動(例如在緊縮或置換之後)時不可或缺。由基底暫存器或記憶體管理單元完成的動態重定位,正是給作業系統隨意調動行程的自由的那種形式。
一個可重定位程式裡含有「跳到位址 250」。載入到基底 90000 時,靜態重定位把它改寫成「跳到 90250」。在動態重定位下,那道指令仍寫著 250,而硬體在每次執行時加上基底 90000。
靜態重定位把程式碼改寫一次;動態重定位則在每次存取時調整。
重定位與位址繫結密切相關:載入時繫結使用靜態重定位,執行時繫結使用動態重定位。靜態重定位無法在程式載入後再移動它。
又称
另见