主記憶體:配置、連結與分段

位址繫結(address binding)

想像在還沒訂好場地之前就先寫派對邀請函。你可以(1)現在寫的時候就印上真正的街道地址——但這樣你就被鎖死在那一個會場;或(2)留白,寄出時才蓋上地址;或(3)發出寫著「到門口看公告牌」的卡片,讓客人抵達時自己找房間。位址繫結正是這個選擇:程式裡的位址究竟在哪個時刻被綁到真正的記憶體位置?

有三個經典時機。編譯時繫結:如果你事先知道程式會放在哪裡,編譯器可以直接產生絕對位址;程式碼很快,但被卡死在那一個位置(用於某些簡單的嵌入式系統)。載入時繫結:編譯器產生可重定位的程式碼(位址相對於起點),而當載入器放置程式時,再加上選定的起始點來修正它們;程式可以放到任何地方,但一旦載入就不能移動。執行時繫結:程式持續使用邏輯位址,而到實體的轉譯在執行時的每一次存取都由硬體完成;這讓作業系統可以連行程執行中都將它搬移,也是所有現代通用系統採用的方式。

為什麼重要:繫結的時機決定了作業系統有多少自由。較早繫結比較簡單但僵化;較晚繫結需要硬體協助(記憶體管理單元),但給了作業系統重定位、置換與保護行程的彈性。整套邏輯與實體位址機制的存在,就是為了讓執行時繫結便宜到可以在每一次記憶體存取時進行。

同一個編譯好的程式執行兩次。在載入時繫結下,載入器把副本 A 放在基底 5000(將每個可重定位位址加上 5000)、把副本 B 放在基底 90000。在執行時繫結下,什麼都不改寫;記憶體管理單元只是在每次存取時加上基底。

越晚繫結=越少改寫、越多彈性,代價是需要硬體轉譯。

只有執行時繫結能讓作業系統在行程已經開始執行後重定位它;前兩種一次就把位置定死。這就是現代系統願意為記憶體管理單元付出代價的原因。

又称
binding of instructions and data to memory位址綁定