Address Binding Introduction
當我們在程式裡呼叫 foo() 實際上是在告訴電腦「跳到存放 foo() 的記憶體位置並且執行它」。但 foo() 的記憶體在哪裡?在寫下程式碼的時候我們根本無從得知
Address binding 做的便是將程式碼中會引用到記憶體的記憶體位置「確定下來」,綁定到真實記憶體的過程
Three Stages
Compile Time Binding
如果在編譯程式碼的時候我們就已經知道程式會被載入記憶體的哪個位置,我們就可以直接將實體地址寫死進去,我們稱之為 absolute code
但這種方式的問題是當我們想要載入程式的記憶體位置改了,我們就需要重新編譯整個程式
Load Time Binding
既然不知道地址,那我們就讓編譯器產生 relocatable code。它不會把絕對地址寫死,而是紀錄「從某個基準地址偏移多少」
接著 linker 會將 object module 串接成一個 load module,然後 loader 在將程式載入記憶體時根據實際被載入的實體地址統一調整為絕對地址,這個過程稱為 relocation
我們會產生一個 base 和 base limit 分別告訴我們這個程式被分配到的記憶體的起終點,透過每次存取檢查是否在此二值之間可以確保 process 不會存取到其他 process 的記憶體
但此方法當我們將程式載入記憶體後想要再搬移就會很麻煩了,因為 loader 已經將相對地址映射到絕對地址了
Execution Time Binding
這是現代 OS 採用的方法:我們程式使用的記憶體位置為 logical address 而非 physical address,MMU 負責將 logical address 映射到 physical address 上
在 compile 和 load time,logical address 和 physical address 都會是相同的。而在 execution time,當因為 context switch 或其他原因需要搬移記憶體時,我們只要將 logical address 對應到的 physical address 做修改而不需要改到程式中的 absolute logical address