## 用戶程序的多步處理  * CPU 所能直接訪問的存儲器只有 memory 和 CPU 內的 register。如果數據不在 memory 中,那麼在CPU使用前必須先把數據移到 memory 中。 * memory 空間保護的實現,是通過CPU 硬體對 User mode 所產生的每一個地址與 register 的地址進行比較來完成的。若 User mode 下執行的程序試圖訪問 **作業系統** memory 或其他用戶 memory , 則會作為致命錯誤處理。 * 這種方案防止 User mode (有意或無意地)修改**作業系統**或其他用戶的代碼或數據結構。 ## Address Binding - Compile Time 是一種在編譯期間將符號(如變數、函數等)與其對應的Address Binding在一起的過程。 **程序被寫成符號代碼** * 編譯器將符號代碼翻譯成絕對代碼 * 如果起始位置改變則重新編譯 * 示例:MS-DOS .COM 格式二進製文件 ## Address Binding - Load Time 是指在程式的執行過程中,將符號(如變數、函式等)與其對應的記憶體地址進行綁定的過程。 * 編譯器將符號代碼翻譯成**relocatable code** * relocatable code: > 它具有獨立於特定記憶體位置的特性。這意味著可重定位程式碼可以在記憶體中的不同位置載入和執行,而不需要進行額外的修改或重新編譯。 如果起始位置發生變化,請重新load代碼 ## Address Binding - execution time 編譯器將符號代碼翻譯成Logical address(即Virtual addr)代碼 * 該方案需要特殊硬件(即MMU)  ### memory管理單元 (MMU) * 將 Virtual addr 映射到 Physical Address 的硬體設備 * relocation register 中的值會添加到用戶 process 在發送到 memory 時生成的每個地址中 大多數通用 **作業系統** 都使用這種方法  ## Logical address與Physical Address * Logical address- 由CPU生成 > 別名 Virtual addr * Physical Address - memory module 看到的 * Compile Time 和 load 時Address Binding > Logical address=Physical Address * execution time 時 Address Binding >Logical address ≠ Physical Address * 用戶程序處理的是Logical address; 它永遠看不到真正的Physical Address ## Dynamic Loading 整個程序必須在memory中才能執行嗎? 不,我們可以使用Dynamic Loading 調用例程時會將其load到memory中 >Dynamic Loading 是一種在程式執行期間根據需要動態載入程式碼或資源的機制。它允許程式在執行時根據特定條件或使用者的需求,彈性地載入外部程式庫、模組或資源,以擴展程式的功能或優化資源使用 * 更好的 memory 空間利用率 > 從未load未使用的例程 > 當大量代碼不經常使用時特別有用(例如,錯誤處理代碼) * 通過程序(lib、API 調用)實現不需要 **作業系統** 的特殊支持  ### C 中的 Dynamic Loading 示例 dlopen():打開一個lib並準備使用 desym():在給定(打開的)lib中查找符號的值。 diclose():關閉DLlib #include <dlfcn.h> ``` int main() { double (*cosine) (double); void* handle = dlopen ("/lib/libm.so.6", RTLD_LAZY); cosine = disym(handle, "cos"); printf("%f\n", (*cosine) (2.0)); diclose(handle); } ``` ## Static Linking 指在編譯過程中將所有必要的程式庫和依賴直接包含到可執行檔中的過程。 * Static Linking:load器將lib組合到程序memory映像中 > 浪費memory:重複的代碼 > 執行速度更快 * Static Linking + Dynamic Loading > 仍然無法防止重複代碼   ## Dynamic Linking * 指在執行時期,將程式所需的程式庫和依賴連結到可執行檔中的過程。 * 相較於Static Linking,動態連結不會將程式庫直接包含在可執行檔中,而是在程式運行時使用共享程式庫(shared libraries)來提供所需的功能。 * Dynamic Linking:鏈接推遲到執行時間 > memory中只有一份代碼並由所有人共享 > 每個lib引用的程序memory映像中都包含一個stub > stub調用 -> 檢查引用的lib是否在memory中 -> 如果不在,則load該lib ->執行lib > Windows 上的 DLL(動態鏈接lib) 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up