標籤:sp 檔案 資料 bs 代碼 as 時間 linux 工作
隨著電腦的發展以及進階程式設計語言的出現,應用程式不僅僅要與硬體打交道,還要藉助於一些系統的服務,這些系統不僅僅包括作業系統還有編譯系統等,我們分別來介紹應用程式是如何與這些系統打交道的。
首先來看程式與編譯系統的互動。如今的程式碼規模越來越大,將所有代碼都寫在一個檔案中已經變得不切實際,因此通常將代碼按照功能劃分到不同的檔案中。當一個進階語言寫的程式要想能被處理器執行,那它首先要被編譯系統的編譯器編譯為二進位形式的檔案,即可重定位目標檔案,其次編譯系統的連結器還必須將這些可重定位目標檔案連結成一個可執行檔。對於編譯器如何編譯進階語言這裡不再累贅,主要講解一下連結器是如何工作的。
連結器完成的工作主要包括兩部分:1.符號解析,2.重定位。在Linux系統中,目標檔案通常為ELF格式(windows為PE格式),它由多個節組成,其中包括.text .data .symtab等,.text節中主要是已編譯器的機器代碼,.symtab節中主要存放符號,包括全域變數、函數名等。當將可重定位的目標檔案連結起來時,它先解析各個可重定位目標檔案中引用的符號,如果遇到的符號在自己的符號表不存在,那它就去別的目標檔案中的符號表中去尋找,這樣就把代碼中的每個符號引用與確定的符號定義聯絡起來。接下來是重定位,首先連結器將所有目標檔案的相同類型的節合并為同一類型的彙總節,並將運行時儲存空間地址賦給這些彙總節以及定義的每個符號,其次連結器修改代碼節和資料節中對每個符號的引用,使之指向符號的運行時地址。這樣整個連結就完成了,形成的檔案也稱為可執行目標檔案。
再來看程式與作業系統的互動。如今的電腦已不再局限於以前的單道程式的執行,而是多道程式的並發執行,就像我們可以一邊聽歌一邊玩遊戲一樣,那對於單一處理器的電腦來說這是如何?的呢?大家肯定想到了是進程,毫無疑問,進程這個概念對於電腦系統來說是非常深刻的影響也是很深遠的,各位讀者可以仔細琢磨它的深刻性!
進程的經典定義就是執行中程式的執行個體。它提供了一種假象使得我們以為自己在獨佔處理器和儲存空間。首先來看獨佔處理器的假象,在有n個進程的作業系統中,這n個進程輪流執行一個時間片,然後被搶佔。其中每個進程中程式計數器(即PC)的值序列與別的進程中的序列是相互獨立的,這樣就為我們製造了一種處理器只運行自己程式的假象。再來看獨佔儲存空間的假象,在一個有n位地址的機器上,地址空間是1—2^n-1的集合,每個進程都有2^n大小的地址空間。其他進程不能訪問,至於它的實現主要是虛擬儲存空間來實現的。
當我們在程式中動態申請塊時,像c語言的malloc函數等,這是作業系統的虛擬儲存空間來為我們分配塊的。虛擬儲存空間是硬體異常、硬體地址翻譯、主存、磁碟檔案和核心軟體的完美互動,它在主存中只儲存即時區域,並根據需要在磁碟和主存之間來回傳遞資料。
你真的深入理解電腦系統了嗎之篇章一:程式與系統的互動