作業系統學習之程式編譯,鏈結,載入過程中的記憶體管理

2021-06-22 18:50:06 字數 731 閱讀 9057

程式從**到可執行程式的過程:

**-編譯-鏈結-載入-執行

編譯器將所有的翻譯過的機器指令寫入**段。考慮可重定位物件模組中的過程入口點,一般而言,編譯器不能確定入口點的位址,因為目標過程可能在不同的可重定位模組中。例如,如果目標是庫例程,如printf(),目標函式在系統軟體建立時就編譯好了。由於在編譯時不知道目標模組的位址,所以目標函式不能被繫結,知道聯結器將呼叫函式的模板與定義函式的模版鏈結為止。編譯器將註明對每個外部位址的引用,使得鏈結器在鏈結時可以確定在絕對程式中外部引用的位址,並能將正確的位址填入**中。

現在考慮靜態變數在源程式中是如何處理的。(即使靜態變數出了作用域,它仍保持最後一次儲存的值)在編譯時,編譯程式生成**在資料段為靜態變數分配儲存位置,然後指令中使用資料段中的相對位址引用變數。但是如果乙個c語言的自動變數,編譯器會產生**在執行時棧中回到作用域,它不會保持舊的值。自動變數的儲存空間會在程式執行時動態建立和釋放,所以編譯器會產生相對於棧的底部(而不是資料段位址)的變數指標。

載入:在載入乙個絕對程式之前,儲存管理器會分配一塊主存給程序。然後載入器會將絕對程式和資料拷貝到分配的儲存器中。注意,絕對模組的**段部分中的位址需要再次調整。鏈結器將絕對程式中的所有位址設定成好像模組是從主存位置0處載入的。然而,模組現在是主存中的乙個特定實體地址被載入的:儲存塊彙總的首位址需要由儲存管理器指定。載入器轉換每個內部邏輯主位址,使得它引用的是被分配的主存位址(而不是資料段或**段的偏移量)。將程式使用的位址與主存中的物理儲存位置相關聯的過程稱為位址繫結。

作業系統學習筆記 鏈結

對於我們經過信心苦苦開發過後完成的 往往需要經過編譯,彙編,鏈結之後才能形成可執行的 其中鏈結過程指的是將程式所需要的 與資源整合到乙個可執行檔案中的過程。其中鏈結過程能夠發生在編譯過程中,載入時和執行時,在這三種情況下的鏈結過程都有一定的差別。並且這三種鏈結過程與聯結器處理的三種目標檔案型別相關,...

作業系統學習

看了幾天的資料,今天終於有時間把測試環境搭建起來。模擬機bochs nasm ultraiso 模擬機bochs的設定不難,在網上搜了些資料和參考了bochs的說明檔案,基本上就可以組建並執行起來。在網上下了個dos的映象,執行bochs從a盤啟動,之後把硬碟分割槽格式化,乙個最基礎的測試環境就完成...

作業系統學習

1 處理器硬體故障中斷事件 由處理器,記憶體儲器,匯流排等故障引起 程式性中斷事件 2 處理器執行機器指令引起 1.1 除數為零,運算元溢位等算術異常 1.3 終止程序指令 終止程序 3 自願性中斷事件 1.1 處理器執行陷入指令請求os服務引起 1.2 請求分配外設,請求io等 1.3 處理流程是...