Linux核心之程序和系統呼叫

2022-08-30 19:57:13 字數 1489 閱讀 8420

我們先嘗試編寫建立兩個程式,來理解linux建立新程序的過程:

1 #include 2 #include 3

4int

main()

5 else

11return0;

12 }

執行結果為:

child process!

parent process!

**二

1 #include 2 #include 3 #include 4

5int

main()

6

執行結果

hello world!
通過上面的對比,可以看錯:fork實際上是複製了乙個「自己」,在fork之後有兩個自己在執行。子程序和父程序是依靠fork的返回值是否為0來決定執行流。返回值為0則是子程序。返回值不是0則是父程序。

execl則是將執行的內容完全替換掉。在execl之後,執行的完全是乙個新的程序。就程序不復存在。

可以將fork看作是複製,而execl則是替換。

linux就是這樣建立程序的:fork乙個程序,在用execl載入新的執行程式,替換新建的程序的執行內容。比如ls:bash通過fork乙個新的bash,再execl("ls")來建立乙個ls程序。

想要詳細定位fork和execl在核心中的實現需要了解linux系統呼叫的處理流程。我們以fork為例子。我們可以通過下面的**呼叫fork:

#include #include 

#include

#include

#include

intmain()

else

if (pid > 0

)

return0;

}

這樣就能通過核心呼叫fork了。可以看到我們是通過int 0x80這條指令實現的。實際上,這是乙個中斷。我們通過128號中斷呼叫核心的中斷服務例程,呼叫fork的。

在系統呼叫的過程中,我們需要記住兩張表。

一、中斷向量表:在核心啟動時初始化,然後當有中斷發生時,核心就會根據中斷向量號(如:0x80),查詢對應的中斷處理服務程式。

二、系統呼叫表:在編譯核心時就已經解除安裝核心中,系統呼叫處理程式會根據系統呼叫號處理對應的系統呼叫程式。

例如,上圖的getpid函式,然後進入getuid系統呼叫。getuid進入system_call系統中斷服務例程,system_call再去呼叫sys_getuid16執行服務例程。

通過上面的理解,我們就可以很快的使用source insight來查詢fork和execl對應的核心服務例程了。

fork對應的是:kernel/fork.c中的sys_fork函式

execl對應的是:fs/exec.c中的sys_execl函式。

這些函式太過複雜,需要非常好的基礎才能看懂。我目前基礎不夠,只能結合《深入理解linux核心》中的程序和檔案系統兩章做一點簡單的理解。這裡就無法再做分析了。只對理解的部分做出一點總結。

linux核心之系統呼叫

應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...

Linux核心之系統呼叫

linux核心之系統呼叫 1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙...

Linux核心之系統呼叫

1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙個唯一的系統呼叫號,如果系...