老狗——程序編譯連接


知識回顧:

存儲部件層次

主存: 保存進程運行時的程序和數據
寄存器: 速度最快,價格昂貴容量不大,一般以字爲單位,只要存放指令一次操作的數據就夠了 。
高速緩存: 一種速度比內存快的存儲設備,一般同寄存器一樣集成在CPU中。存放內存的部分拷貝,把常用的數據放這裏可以提高速度。將短時間內經常訪問的部分數據從內存放到高速緩存中,減少CPU訪問內存的時間,是基於程序局部性。高速緩存一般不能被程序直接更改,而由硬件自己處理對內存數據的拷貝。• 總之:速度快、存放部分內存數據、硬件自動處理。
磁盤緩存: 內存的一部分,將頻繁使用的一部分磁盤數據信息預讀入在磁盤緩存,減少磁盤讀寫時間。

1. 程序的裝入和鏈接

多道程序環境下,程序運行必須爲之先建立進程。

創建進程的第一件事:將程序和數據裝入內存。

2. 程序進內存的一般過程:

  1. 編譯compiler:編譯程序:將用戶源代碼編譯成若干個目標模塊。
  2. 鏈接link:鏈接程序:將形成的一組目標模塊,及它們需要的庫函數鏈接在一起,形成一個完整的裝入模塊。
  3. 裝入load:由裝入程序將裝入模塊裝入內存,構造PCB,形成進程,開始運行(使用物理地址)。
    程序進內存

3. 地址的概念

  • 邏輯地址(相對地址,虛地址)
  • 物理地址(絕對地址,實地址)內存中存儲單元的地址。物理地址可直接尋址被執行。
  • 地址映射:將用戶程序中的邏輯地址轉換爲運行時由機器直接尋址的內存物理地址的過程。

4. 重定位:把目標程序中的指令和數據的邏輯地址變成內存中的物理地址的地址變換過程。邏輯地址 不等於物理地址

5. 程序裝入中的地址處理

  • 絕對裝入(邏輯地址=物理地址) 邏輯地址 > 重定位 > 物理地址
    絕對裝入
  • 靜態重定位裝入:地址映射在程序執行之前進行,重定位後物理地址不再改變。
    靜態可重定位裝入
  • 動態運行時重定位裝入
    動態運行時裝入

裝入完了如何記錄下進程在內存哪裏?

  • 程序作爲整體連續裝在一塊內存的,記錄下基地址即可。
  • 程序離散裝入在不同內存位置的,需記錄下多個偏移用的基地址(後面內存分配裏詳細討論);
  • 動態重定位的,這些被記錄的基地址不一定固定不變,可能會根據內存使用情況變化更新。

6. 不同的程序鏈接裝入方式(使用內存的時機)

  • 靜態鏈接:裝入運行前將多個目標模塊及所需庫函數鏈接成一個整體,以後不再拆開。
    在這裏插入圖片描述
  • 裝入時鏈接:裝入內存時,邊裝入邊鏈接的鏈接方式。
    在這裏插入圖片描述
  • 運行時鏈接:對某些目標模塊的鏈接,在執行中需要該目標模塊時,纔對它進行鏈接。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章