Linux中程式的執行原理

2021-06-16 22:38:29 字數 1854 閱讀 1265

linux中程式的執行原理

在linux的開發環境中,c語言程式的執行環境如圖1-3所示。

作為unix作業系統的一種,linux的作業系統提供了一系列的介面,這些介面被稱為系統呼叫(system call)。在unix的理念中,系統呼叫"提供的是機制,而不是策略"。c語言的庫函式通過呼叫系統呼叫來實現,庫函式對上層提供了c語言庫檔案的介面。在應用程式層,通過呼叫c語言庫函式和系統呼叫來實現功能。一般來說,應用程式大多使用c語言庫函式實現其功能,較少使用系統呼叫。

圖1-3  linux下c語言程式的結構

在linux等系統的環境中,c語言庫及其標頭檔案都是系統的一部分,只要安裝了編譯工具即可以完成c語言程式的開發。這點與windows中程式的開發有所不同,windows中一般需要安裝開發包才能進行程式開發。

c語言程式經過編譯-彙編-連線,最終生成可執行程式格式。可執行程式中包含兩個部分的內容:

程式頭程式主體(二進位制機器**)

在程式頭中包含了供作業系統載入的資訊,作業系統根據這些資訊載入可執行程式。而可執行程式的主體依然是二進位制的機器**。程式在執行的時候,正是靠逐條地執行這些機器**,形成程式執行的序列。

如果開發者定義了乙個二進位制介面集合,elf標準允許用它來支援流線型的軟體執行。通過它可以減少不同執行介面的數量,也可以減少重新程式設計和重新編譯的**。

elf檔案格式包括三種主要的型別:可執行檔案、可重定向檔案、共享庫。

1.可執行檔案(應用程式)

可執行檔案包含了**和資料,是可以直接執行的程式。

2.可重定向檔案(*.o)

可重定向檔案又稱為目標檔案,它包含了**和資料(這些資料是和其他重定位檔案和共享的object檔案一起連線時使用的)。

3.共享檔案(*.so)

也稱為動態庫檔案,它包含了**和資料(這些資料是在連線時候被聯結器ld和執行時動態聯結器使用的)。動態聯結器可能稱為ld.so.1,libc.so.1 或者 ld-linux.so.1。

object檔案參與程式的連線(建立乙個程式)和程式的執行(執行乙個程式)。object檔案格式提供了乙個方便有效的方法來用並行的視角看待檔案的內容,這些object檔案的活動可以反映出不同的需要。乙個elf頭存在於檔案的開始處,在這裡儲存了路線圖(road map),描述了該檔案的組織情況。節(section)儲存著object 檔案的資訊,從連線角度看它包括指令、資料、符號表和重定位資訊等。

elf檔案格式如圖1-4所示。

乙個elf檔案從聯結器(linker)的角度看,是一些節的集合;從程式載入器(loader)的角度看,它是一些段(segments)的集合。elf格式的程式和共享庫具有相同的結構,只是段的集合和節的集合上有些不同。

elf格式的共享庫可以載入到任何位址。事實上,共享庫使用pic(place independence code,位置無關**),使得檔案的**段(text page)不需要重定位,並且可以被多個程序共享。elf格式的聯結器通過got(global offset table)來支援pic**。

abi是系統與應用之間的協議. 乙個binary(exec, lib)必需符合abi才能在相應的系統上執行.

比如我在pc上用不管什麼樣的compiler, 只要產生符合linux的elf檔案, 用相應的instruction set(比如intel, ppc, sparc). 就可以在乙個linux機器上執行. 呼叫系統或別人的lib.

abi定義了binary的檔案格式, 內容, 以及裝載/解除安裝程式的要求, 函式呼叫時引數傳遞規則, 暫存器, 堆疊的使用等.

Linux中程式後台執行命令

1.讓命令後台執行 2.輸出重定向 3.2 1 將標準出錯重定向到標準輸出 4.nohup 退出終端後,程式依然後台執行 5.jobs 檢視後台執行的程序 6.fg 把後台執行的命令 7.ctrl z 暫停某個程序 8.bg 繼續執行後台暫停的程序 9.kill 終止程序 python 列印1 30...

中程式的執行過程

對於乙個基本的 程式一般的執行過程如下 預處理 主要是標頭檔案的展開,巨集的展開 編譯 這個階段編譯器主要做詞法分析 語法分析 語義分析等,在檢查無錯誤後後,把 翻譯成組合語言 彙編 組合語言轉化為機器語言的過程 常見的一些gcc命令 選項名作用 o產生目標 i s o 可執行檔案等 c通知gcc取...

C 中程式的互斥執行

using system using system.drawing using system.collections using system.ponentmodel using system.windows.forms using system.data using system.threadin...