Background
- 程式會在記憶體與硬體中間搬移,但最後會在記憶體內執行,且在執行時會使用到register,才能到控制unit中做硬體的process。
- 記憶體只知道兩種指令,且都是一連串的指令:
- address+read requests
- address+data and write requests ⇒ 但速度較慢
- Register存取一個指令,通常在一個CPU clock內或更少時間內完成。
- 記憶體管理比register存取高一個order;I/O device又比記憶體管理高一個order,所以在這之中存在著速度差的關係。
- 所有process在一個大的記憶體中執行,所以需要控制整個空間,但因為空間是共用的,所以需要保護自己的process,以免資源被別人拿去使用。
Base and Limit Registers(Hardware Support)
一個logic address space是由base和limit register所定義的。
- Base:process的起始位置。
- Limit register:process的大小。
CPU會負責以每個process ID來檢查每個process是否有在自己的位置上。(between base and limit)
Address Binding
- 程式雖被儲存在硬碟上,但須被載入記憶體中才能形成process去執行,而在硬體上等待的所有process會形成一個input queue。
- 一般來說記憶體的起始位置是0000,但使用者的位置卻不一定,因為有可能已經被別人先使用了。
- 此外,address在程序生命週期的不同階段以不同方式表示:
-
Source code addresses usually symbolic
-
Compiled code addresses bind to relocatable address
- Linker 或 Loader 將 relocatable address 綁定到 absolute addresses
Linker:將程式需要的像是一些library、code、proess等連接在一起。
Loader:將link好的程式,再load到確定的記憶體位置。
Binding of Instructions and Data to Memory
- Address在將指令與數據綁定到記憶體時,會發生三種不同的階段:
-
Compile time:如果已經知道記憶體的位置,便產生 absolute code,但有更改位置的話,code也需要重新產生(recompile)。
-
Load time:如果程式在 Compile time 並不知道記憶體位置的話,就產生relocatable code。
-
Executin time:如果process在執行時,記憶體segment被搬移到另一個segment的話,連接就會延遲到這時才開始。
- 大部分作業系統都使用這個方法
- Need hardware support for address maps (e.g., base and limit registers)
Logical vs. Physical Address Space
- Logical address:由 CPU 產生。可說是當一個程式的最終位置未確定前的位置,也可稱為「virtual address(虛擬地址)」。
- Physical address:真正記憶體的位置,由memory unit所看到。
compile-time和load-time address binding schemes,logical = physical address。
在execution-time address-binding scheme就不同了。
- Logical address space:Program 所產生的所有 logical address 的集合。
- Physical address space:這些邏輯地址對應的所有物理地址的集合。
Memory-Management Unit(MMU)
- 管理記憶體的硬體部分。
- Base register在實作中可以檢查從logical address轉移到physical address的動作,所以又稱為relocation register。
- 使用者程式可以處理 logical address,它永遠不會看到真正的 physical address。
- 當引用記憶體中的位置時,就會發生execution-time binding。
- logical address和physical addresses綁定在一起。
Dynamic relocation using a relocation register
- 當模組被呼叫時,才能將其載入主要記憶體中。(Routine is not loaded until it is called)
- 為了有更好的memory-space使用率,所以沒有使用的routine將永不載入。
- 所有的routine以可重定位(relocatable)的加載格式,保存在硬碟上。
- 當大量的code被需要去處理不常發生的事件時,就會非常有用(e.g 錯誤常式)。
不需要操作系統的特殊支持 (和 MMU 沒啥關係)
- 通過 program design 實現
- 操作系統可以通過提供 library 來幫助實現 dynamic loading
Dynamic Linking
- Static linking(靜態連接):將 system libraries 載入 program code(由loader連結在一起),再由進入 binary program image。
- Dynamic Linking(動態連接):將 linking 延遲,直到執行時間。(並非"載入時發生")
- Stub 是 code 的一小片段,用於查找 memory-resident library routine。
- OS會檢查是否routine在processes' space中。
- 動態連接對於libraries特別有用
- 此系統也可被稱為shared libraries。
- 考慮是否適用於patching system libraries。