《深入理解作業系統》1 程式的執行過程

2021-06-18 16:05:02 字數 1632 閱讀 6728

程式先由程式設計師編輯建立並儲存在硬碟上,源程式在機器上表現為01組成的位序列,8個位乙個位元組,每個位元組表示乙個文字字元,它是以ascii碼的形式表示的。只由ascii字元組成的檔案叫做文字檔案,所有其他的叫做二進位制檔案。

為了讓機器能夠識別並執行程式,每條語句必須被轉為低階機器語言指令,然後將指令按照可執行目標程式的格式打包,並以二進位制磁碟檔案的形式存放起來。以c程式為例,轉換過程大致分為預處理,編譯,彙編,鏈結四個步驟。下面進行詳細解釋。

預處理器根據以字元#開頭的命令修改原始的c程式,比如#include告訴預處理器讀取系統標頭檔案stdio.h的內容,並把它直接插入程式文字中,將#define的變數替換等等,結果得到了另乙個c程式,通常以.i作為副檔名。

編譯器將文字檔案hello.i翻譯成hello.s,它包含了乙個組合語言程式。組合語言程式中的每條語句都以一種標準的文字格式確切的描述一條低階機器語言指令。

彙編器將匯程式設計序翻譯為機器語言指令,把這些指令打包成可重定位目標程式(relocateble object program)的格式,並把結果儲存在hello.o中。hello.o檔案是二進位制檔案,因為他的位元組編碼是機器語言指令而不是ascii碼。如果用文字編輯器開啟hello.o會看到一堆亂碼。

鏈結階段,比如hello中用到了printf函式,這是標準c庫的函式,存在於乙個名為printf.o的單獨編譯好的目標檔案中,這個檔案必須以某種方式合併到我們編譯好的的目標檔案中。鏈結器(ld)程式負責處理這種合併,結果得到hello檔案,它是可執行目標檔案,可以被載入到記憶體中,由系統執行。

轉換完成之後就是執行了。在unix系統中,shell是乙個命令列直譯器,輸出乙個提示符,等待使用者輸入然後執行命令。如果輸入的第乙個單詞不是乙個內建的shell命令,shell將其解釋為可執行檔案,比如輸入./hello,它將載入並執行這個檔案。hello在螢幕上輸出資訊,然後終止。shell輸出乙個提示符,等待下乙個輸入的命令列。具體的過程為:初始時,shell執行它的指令,等待輸入。使用者輸入字元創「./hello」後,shell將字元逐一讀入暫存器,然後存放到儲存器中,敲回車鍵後,shell知道使用者結束命令輸入。然後shell執行一系列的指令來載入可執行的hello檔案,將hello目標檔案的**和資料從磁碟複製到主存,資料報含輸出的字串"hello,world\n"。一旦目標檔案hello中的**和資料被載入到主存,處理器開始執行main的機器語言指令,將字串從主存拷貝到暫存器,並輸出到螢幕上。

由於涉及大量的主存,磁碟,暫存器通訊,故產生了cache等緩衝提高速度的裝置,減少通訊阻塞。

為了減少使用者的負擔,作業系統對計算機硬體資源進行了抽象,產生了程序,執行緒,虛擬位址等概念。程序是程式的一次執行,是作業系統分配資源的單位,多個程序是可以併發執行的,併發執行實際上每個時刻執行的還是乙個程序,只不過程序間切換的速度比較快,給人的感覺是併發執行。作業系統為每個程序儲存執行的狀態資訊,稱為上下文,包括pc和暫存器檔案當前值,主存內容等等。切換程序時,發生上下文切換。乙個程序中可以有多個執行緒執行單元,每個執行緒都執行在程序的上下文中,共享同樣的**和資料,由於網路伺服器等應用對並行處理的需求越來越大,多執行緒模型也越來越重要。虛擬位址為每個程序提供了乙個假象,即每個程序都在獨佔主存,每個程序看到的是一致的儲存器,稱為虛擬位址空間。虛擬位址空間是由大量的準確定義的區構成,linux從低位址到高位址依次為:程式**和資料;堆;共享庫;棧;核心虛擬儲存器。

程式執行的大概知識就是這些。

深入理解作業系統 3 程序的控制

1.程序的執行模式 1.使用者模式 非特權模式。2.核心模式 又叫系統模式,控制模式或核心模式。在核心模式下的軟體會完全控制處理器和所有指令,暫存器和記憶體。模式切換 當使用者呼叫乙個作業系統的服務或者中斷觸發系統例程的執行時,執行模式會由使用者模式轉換為核心模式。當從系統服務返回使用者程序時,執行...

深入理解計算機作業系統(1) 鏈結器

鏈結是將各種 和資料片段收集起來組合成為乙個單一檔案的過程。可能發生在編譯 載入到記憶體 程式執行時候。首先使用預編譯器將mian.cpp翻譯成main.i ascii碼的中間檔案 再使用編譯器翻譯成main.s 彙編檔案 再使用彙編器翻譯成可重定位目標檔案main.o,最後使用鏈結器將main.o...

深入理解計算機系統 (1) 程式的執行過程

首先是圖1 3展示的乙個helloworld程式的整個執行過程。1 預處理階段 預處理器 cpp 根據以字元 開頭的語句,修改原始的c程式。比如 include命令,就會告訴預處理器把頭檔案中的內容直接插入到程式文字中,得到了另乙個c程式,通常以.i作為字尾名。2 編譯階段 編譯器 ccl comp...