程式編譯鏈結

2021-09-01 14:48:18 字數 2795 閱讀 6704

認識各種儲存部件

暫存器、記憶體、磁碟

暫存器、快取記憶體、記憶體、磁碟快取、磁碟

主存:儲存程序執行時的程式和資料

暫存器:速度最快,**昂貴容量不大,一般以字為單位,只要存放指令一次操作的資料就夠了 。

儲存部件的層次

快取記憶體:

一種速度比記憶體快的儲存裝置,一般同暫存器一樣整合在cpu中。

存放記憶體的部分拷貝,把常用的資料放這裡可以提高速度。

磁碟快取:

記憶體的一部分,將頻繁使用的一部分磁碟資料資訊預讀入在磁碟快取,減少磁碟讀寫時間。

儲存器管理的操作

儲存器資源的分配和**

位址變換(邏輯位址與實體地址的對應關係維護)

儲存共享和保護

虛擬儲存的排程演算法

儲存器管理

1 程式的裝入和鏈結

2 連續分配儲存管理方式

3 分頁儲存管理方式

4 分段儲存管理方式

5 虛擬儲存器、請求分頁/分段、頁面置換演算法

1.程式的裝入和鏈結

多道程式環境下,程式執行必須為之先建立程序。

建立程序的第一件事:將程式和資料裝入記憶體

程式進記憶體的一般過程:1.

編譯compiler:編譯程式:將使用者源**編譯成若干個目標模組。

2.3.

裝入load:由裝入程式將裝入模組裝入記憶體

,構造pcb,形成程序,開始執行(使用實體地址)。

1)位址的概念

邏輯位址(相對位址,虛位址)

實體地址(絕對位址,實位址)

將使用者程式中的邏輯位址轉換為執行時由機器直接定址的記憶體實體地址的過程。

即:使用者的第10位元組處的指令在記憶體的第多少位址上。

2)程式裝入中的位址處理

絕對裝入(邏輯位址=實體地址)

靜態重定位裝入(邏輯位址à重定位à實體地址)

動態執行時重定位裝入

3)不同的程式鏈結裝入方式(使用記憶體的時機)

裝入執行前將多個目標模組及所需庫函式鏈結成乙個整體,以後不再拆開。)

某些

目標模組的鏈結,在執行中需要該目標模組時,才對它進行鏈結。)

裝入完了如何記錄下程序在記憶體**?

程式作為整體連續裝在一塊記憶體的,記錄下基位址即可。

程式離散裝入在不同記憶體位置的,需記錄下多個偏移用的基位址(後面記憶體分配裡詳細討論);

動態重定位的,這些被記錄的基位址不一定固定不變,可能會根據記憶體使用情況變化更新。

重定位:把目標程式中的指令和資料邏輯位址變成記憶體中的實體地址的位址變換過程

思考與問題

程式是不是要一次全裝進記憶體?如果不是要採用什麼鏈結裝入方式?

執行時動態連線裝入方式

在動態重定位方式下,cpu要執行實體地址a下的指令,指令中要訪問的資料的位址是相對位址還是實體地址?

相對位址,只有通過位址對映才能知道資料存放在記憶體的具體位置。

程式的編譯 鏈結

在linux下,使用gcc來編譯hello world時,只使用最簡單的命令 gcc hello.c a.out hello world 但上述過程可以分解為4個步驟,即預處理 編譯 彙編 鏈結。預處理 預編譯 gcc e hello.c o hello.i 或者 cpp hello.c hello...

程式編譯和鏈結

程式進記憶體的一般過程 1 編譯compiler 編譯程式 將使用者源 編譯成若干個目標模組。2 鏈結link 鏈結程式 將形成的一組目標模組,及它們需要的庫函式鏈結在一起,形成乙個完整的裝入模組。3 裝入load 由裝入程式將裝入模組裝入記憶體,構造pcb,形成程序,開始執行 使用實體地址 靜態可...

程式的編譯,鏈結

我們基本都知道乙個程式由 行再到最後被執行生成目標檔案,會經歷四個過程 1 預編譯 prepressing 2.編譯 compilation 3.彙編 linking 4.鏈結 assembly 但其中每個步驟都發生了什麼,還是不太清楚,今天我們就來學習了解下這個過程.一.預編譯.假設原檔案是.c檔...