---
# System prepended metadata

title: OCW CH8 - Memory Management
tags: [OS]

---

---
title: 'OCW CH8 - Memory Management'
disqus: hackmd
---

[TOC]
# Memory Management

## Address Binding

* 位址定位 (Address Binding) 決定程式的起始位置：
在程式編譯 (Compile) 後，符號化的地址(參數、函數)因為存取的記憶體位置可能不是連續的。

* 所以之後的鏈結器 (Linker) 或載入器 (Loder) 可能會將他們重行定址，把地址連結(bind) 至絕對地址(absoulte address)、即實際上在 Memory 的位置。

* 與記憶體位置的連結(bind)至絕對地址的時間點，可以在以下任何步驟完成。

---

### 編譯時期 (Compile time)
* 若編譯期間知道 process 會在記憶體何處，則產生==絕對碼(Absolute object code)==。
* 在 Linkage Editor 時將程式所用的函數，鏈結到程式碼區段。
* 而之後的 Loader 我們稱作他為 Absolute Loader，依序將 ==絕對碼(Absolute object code)== 載入到 memory 之中。
* 若程式的起始位置變更了，那就得從頭使用 compiler 在執行一遍，包括後續的 Link 與 Load。
![](https://i.imgur.com/JBie2bA.png)


---

### 載入時期 (Load Time)
* 若編譯 (Compile) 時不知到需要用到的變數、函數會在記憶體何處，則 Compiler 必須產生==重新定位碼 (Relocated Code)==，並且會在不知道實際位置的程式碼加註記號。

* ==重新定位碼 (Relocated Code)== 包含了以下資訊
    * Linking Info : 在 Linkage Editor 時會將程式使用到的函數地址鏈結近來，因此就可以處理在 Compile 時不知道實際位置的函數。 

    * Relocation Info : 因為起始位置隨著載入 memory 的地方而有所不同，根據欲載入的起始位置做為 $Base$ $address$ 再加上相對的偏移量 $Offset$ 即是正確的地址

* 若程式的起始位置變更了，我們只需要重新做一次 Link 與 Load 即可，不需要再使用 compiler 編譯成機器語言。
![](https://i.imgur.com/1eZrrwB.png)


---

### 載入時期 (Load Time) ver.2
* 跟上一種不同的地方是，原本 Linkage Editor 會到處將分散在各處的函數地址修正在 Main code 裡面，只需要加上偏移量即可知道他在記憶體的何處。

* 為了節省重新執行程式時 Linkage Editor 重新 Link 的時間，我們在此種採用的方法為：將所有用到其他 Memory 中的程式碼區段與 Main Code Link 成一個連續的記憶體分段。

* 因此我們就不需要每次都在找失散在 Memory 各地的函數了，只需要重新使用 Loader 修正偏移量以及重新地址最後再載入到 Memory 即可




---

### 執行時期 (Execution Time)
* 藉由額外的硬體資源：MMU 輔助計算實際的記憶體位置
* 若使用 OS 則需要使用中斷機制、導致效能低落
![](https://i.imgur.com/Am1C8c0.png)


---

### Address Binding 流程圖
![](https://walkccc.github.io/CS/assets/os/8.3.png =400x)

---

### Logical (Vitual) vs. Physical (Absolute) Address

* Logical address – generated by CPU

* Compile-time & Load-time address binding
    * logical addr = physical addr
* Execution-time address binding
    * logical addr ≠ physical addr

---

### Static/Dynamic Linking
* Static Loading
* 
* Dynamic Loading
* 
* Static Linking
    * 將程式所需要的函數、資源等全部加入程式的執行檔
    * 需要較大的記憶體空間
    * 當所用的函式庫越多時，執行檔也就越龐大。

* Dynamic Linking
    * 程式執行時才被載入，而不是直接編譯在執行檔中
    * 讓系統更彈性的應用硬體資源，且可以不公開程式碼的情況分享給別人使用。
    * 由於靜態連結是把整個 Library 包進去執行檔，因此可以保證到不同機器環境下執行時，也不會因為少了這個函式庫導致無法執行檔案
    * 缺點是檔案 (儲存空間) 比較大
    * 在程式開始執行時才載入的，執行檔較小，而且更新程式庫無需重新編譯其他程式

* Sum up
    * 當檔案共用多個函式庫，可採用動態連結，反之就建議採用靜態連結。

    * 可由檔名來判斷是否使用動態連結
        * 在微軟的作業系統上，
            * 動態連結為 .dll
        * 在蘋果的作業系統上

            * 動態連結為 .dylib
            * 靜態連結為 .a



---

## Swapping


 ###### tags: `OS`