對於我們經過信心苦苦開發過後完成的**往往需要經過編譯,彙編,鏈結之後才能形成可執行的**。其中鏈結過程指的是將程式所需要的**與資源整合到乙個可執行檔案中的過程。其中鏈結過程能夠發生在編譯過程中,載入時和執行時,在這三種情況下的鏈結過程都有一定的差別。並且這三種鏈結過程與聯結器處理的三種目標檔案型別相關,他們分別為可重定位的目標檔案,可執行的目標檔案和共享的目標檔案。下面來詳細分析三種鏈結過程。
首先對於發生在編譯過程中的鏈結過程,這也是在編碼之後經常會用到的鏈結過程,經過編譯之後的檔案被組織成了可重定位的目標檔案格式。對於每個可重定位的目標檔案,**,資料,宣告等資訊以分段的形式儲存於目標檔案中。其中**儲存於**段中,對應於全域性變數或者方法的引用在這裡被作為符號儲存於符號段中,諸如此類各種資訊唄儲存於其所對應的段中。鏈結過程首先要做的便是進行符號的解析。所謂的符號解析過程便是將**中的全域性變數,方法等對應到符號表中的具體符號,以便後期利用符號替換為真正的記憶體位址。在完成符號的解析過程後便可以進行重定位,首先將各個目標檔案的各個分段合併成乙個,形成乙個單獨的可執行目標檔案,之後便能夠為符號表中的各個符號制定記憶體位址,這樣之後每個全域性變數,全域性方法都會有自身的記憶體位址。最後將真實的變數和方法的引用替換為主儲存器的位址便完成了整個連線過程,這樣在可執行目標檔案執行的過程中就能夠直接利用主儲存器位址執行相應的**或者讀取所需變數的值了。在這過程中不難發現乙個問題,既然是先進行編譯之後才進行連線,那麼對於全域性變數或者方法的非本地連線在編譯過程中如何處理。編譯器採取的策略是利用被稱為重定位條目的資料結構在相應的引用處起到乙個佔位符號的作用,在連線完成之後進行替換。
在實際的應用中編譯過程連線並不能完全滿足我們的需要,動態連線共享庫在實際應用中廣泛使用。人們將常用的功能或者**編譯好之後使之以共享目標檔案的形式存在,再將多個共享目標檔案打包形成共享庫,在編寫的**中只需要引用共享庫中的功能,但是在編譯連線過程中並不把共享庫中的**連線致可執行目標檔案中,而是在可執行目標檔案載入記憶體時根據引用的內容在記憶體中將共享目標檔案載入某個特定段中,這時再利用重定位條目重定位對於共享目標檔案的引用,使之能夠訪問對應的引用,這樣在執行時就能完整的完成程式的功能,而且有效的節省了主儲存器的空間。這種連線過程便是載入時連線。
最後一種連線形式更為靈活,那就是在執行時進行連線。執行時連線所涉及到的主要內容便是與位置無關**,由於已經存在於記憶體中的程式需要對另一共享目標檔案進行引用,然而此時目標檔案有可能並未載入至記憶體,所以自然無法得知引用位址,但這時可以將共享目標檔案載入,其內部**是與位置無關的,所謂的與位置無關指的是**內任何資料的儲存位址與其**值的差值是固定的,此時僅需維護乙個每個變數位置與**位置差值表,因此僅僅需要根據當前pc值利用這個差值進行一步轉換便能夠得到真正的目標位址,然而每次訪問變數都進行一次轉換顯然增加了系統的負擔,因此系統維護了另外乙個變數與其絕對位址的對映表,當第一次訪問特定變數之後其絕對位址便會儲存致表中,之後的訪問只需查詢這個對映表即可。
以上便是對全部連線過程的理解,所需注意的地方便是載入時連線,其連線順序是根據命令從左向右進行連線,所以共享目標檔案一定要在最後,否則會出現連線錯誤。
作業系統學習筆記
這裡專門摘錄作業系統相關筆試題和面試題!也當作自己的乙個複習!乙個很全的作業系統常考知識集合 1.分段式儲存和分頁式儲存,以及段頁式儲存的區別 分頁是一維儲存,分段是二維的 因為分頁給出虛擬位址後,作業系統會自動劃分頁號和偏移量 而分段給出位址後,需要知道段號和偏移量,段的長度是可變的!故是二維的 ...
作業系統學習 筆記
單道批處理評價 資源利用率差 互動性差 等 多道批處理 w為了提高系統的利用率 出現多道批處理 多道 是指 某時刻 多個應用程式再主存中,按照某些原則去處理,逐個執行程式。批處理 使用者提交一批作業,首先存放再外存,排成乙個佇列,然後排程程式按一定的演算法去排程從該佇列 中選取佇列中的乙個或若干個作...
作業系統學習筆記
為什麼需要多執行緒?乙個程序有不同的任務,譬如說乙個程式有不同的方法,有些任務需要等待其他資源的排程 io排程 此時的cpu會空閒等待,加入多執行緒之後,程序分為不同的執行緒去執行不同的任務,使得cpu的利用率大大提高。多執行緒和多程序的區別 多程序是執行不同的程式,多程序切換需要中斷 記錄斷點等資...