詳解程序轉入和鏈接

概要

程序執行過程中,一共經歷了四步,最終生成可執行的目標文件hello.exe,這四個步驟分別是:預處理,編譯,彙編,鏈接

在這裏插入圖片描述

預處理:預處理器(cpp)預處理就是把程序中引用文件插入到當前文本文件中,比如開頭的#include <stdio.h>,包含了stdio.h文件,預處理命令就會讀取stdio.h文件的內容,把它插入到當前的hello.c文件中,生成一個叫hello.i的文件;
編譯:編譯器(ccl) 編譯這個階段就比較重要了,我們平常使用的高級語言有很多種,C,C++,Java……,每種語言書寫表達的方式不盡相同,如何把這些不同的語言統一轉換成一種格式,讓計算機理解他們要做的都是同一件事情呢?那就要靠編譯器了!這裏不同的語言使用的編譯器也不相同,但要實現的功能是一致的。編譯器中存在一個叫做“彙編語言程序”的東西,彙編語言大概是最接近機器語言的了,編譯器要做的事情,就是把預處理完畢的hello.i文件翻譯成彙編語言,生成的文件叫做hello.s;
彙編:彙編器(as)要做的就是把編譯生成的彙編語言,翻譯成機器能讀懂的二進制語言,叫做hello.o;
鏈接:鏈接器(ld)看上圖中代碼調用了一個printf()函數,這是C編譯器中的標準C庫中的一個函數,單獨保存在一個已經預編譯好的printf.o文件中,鏈接器要做的就是把printf.o文件合併到我們的hello.o文件中,最終生成了可執行文件hello;

在這裏插入圖片描述
中間紅線爲分界線,左邊部分爲程序做的事,右邊爲OS做的事–裝入。

程序的裝入和鏈接

編譯程序:將用戶源代碼編譯成若干個目標模塊;
鏈接程序:將一組目標模塊及它們所需要的庫函數鏈接在一起,形成一個完整的裝入模塊
裝入程序:將裝入模塊裝入內存。

程序的裝入

  • 邏輯地址空間(或地址空間):由程序中邏輯地址組成的地址範圍。

【注意】用戶程序經編譯之後的每個目標模塊都以0爲基地址順序編址,這種地址稱爲相對地址

  • 絕對地址(物理地址):內存中各物理存儲單元的地址是從統一的基地址順序編址,這種地址稱爲絕對地址

絕對裝入方式

程序編譯時,如果知道程序將駐留在內存的什麼位置(起始地址),那麼編譯生成的目標代碼,將採用絕地地址進行編址,即起始地址不從0開始,從上面所知的內存起始地址開始編址。

例如:事先已知用戶程序(進程)駐留在從1000號單元處開始的位置,則編譯程序所產生的目標模塊(即裝入模塊)便從1000處開始向上擴展:
在這裏插入圖片描述
由於採用的是絕對地址,所以將裝入模塊直接裝入內存即可,無需進行地址變換。 但是,只適合早期對硬件直接編程、單道環境下使用。

可重定位裝入方式(靜態重定位)

出現:

- 編譯時將程序裝入指定的內存空間,必須需要程序員熟悉內存的使用情況
- 絕對裝入方式只能將目標模塊裝入到內存中事先指定的位置。而在多道程序環境下,編譯程序不可能預知所編譯的目標模塊應放在內存的何處
- 可重定位方式可根據內存的當前情況,將裝入模塊裝入到內存的適當位置

原理:

源程序編譯生成的目標模塊都採用相對地址進行編址,即每個模塊都從0開始編址,當然鏈接後的模塊也採用相對地址編址
在這裏插入圖片描述
將裝入模塊裝入內存後,模塊中的程序和數據等,在內存中都將具有一個物理地址,此物理地址是相對於內存的起始地址進行編址的,所以與原先模塊中的邏輯地址(相對於模塊的起始地址進行編址)不同,所以爲了得到物理地址需要對邏輯地址進行改變。而此地址變化的過程就叫做重定位,又因爲地址變換通常是在裝入時一次完成的,以後不再改變,故稱爲靜態重定位。如下圖:
在這裏插入圖片描述

動態運行時裝入方式(動態重定位)

把相對地址到絕對地址的轉換推遲到程序真正執行時才進行。在運行時地址映射。實際運行中往往會需要程序在內存中的各位置移動,即經常需要重定位到不同的物理地址上。 這種運行時移動程序要求地址變換要快速,實現時一般依靠硬件地址變換機構——一個重定位寄存器。
在這裏插入圖片描述

程序的鏈接

靜態鏈接方式

一次鏈接完畢:在程序運行之前,先將各目標模塊及它們所需的庫函數,鏈接成一個完整的裝配模塊,以後不再拆開。我們把這種事先進行鏈接的方式稱爲靜態鏈接方式。

裝入時動態鏈接

邊裝邊運行:用戶源程序經編譯後所得的目標模塊,是在裝入內存時邊裝入邊鏈接的,即在裝入一個目標模塊時,若發生一個外部模塊調用事件,將引起裝入程序去找出相應的外部目標模塊,並將它裝入內存。

運行時動態鏈接

按需取用:在執行過程中,當發現一個被調用模塊尚未裝入內存時,立即由OS去找到該模塊並將之裝入內存,把它鏈接到調用者模塊上。凡在執行過程中未被用到的目標模塊,都不會被調入內存和被鏈接到裝入模塊上,這樣不僅可加快程序的裝入過程,而且可節省大量的內存空間。
在這裏插入圖片描述

參考:
https://www.cnblogs.com/sunbines/p/9237604.html
https://www.cnblogs.com/suncoolcat/p/3358053.html
https://edu.51cto.com/center/course/lesson/index?id=396796(推薦本視頻,如果有不懂的基本可以解決,視頻例子舉得也很好)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章