Linux核心分析四 系統呼叫

2021-07-10 15:20:09 字數 1603 閱讀 3976

linux核心分析四:系統呼叫

本文是《

linux核心分析

》課程的第四次作業,作者劉洋為您奉上。本次課程分別通過c語言和組合語言實現同乙個系統呼叫,來理解linux系統呼叫。

作業系統為在使用者態執行的程序與硬體設別之間進行互動提供了一組介面,這種分層的設計能夠帶來很多優點。首先,把使用者從底層硬體開發中解放了出來。其次,這極大的提高了系統的安全性。最後,使得程式的可移植性得到了很大的增強。unix系統通過向核心發出系統呼叫(system call)實現了使用者和硬體裝置之間的大部分介面。

當使用者態的程序呼叫乙個系統呼叫時,cpu切換到核心態並開始執行乙個核心函式,在80x86體系結構中,可以用兩種不同高的方式呼叫linux的系統呼叫,兩種方式的最終結果都是跳轉到系統呼叫處理程式(system call handle)的組合語言函式。因為核心實現了很多不同的系統呼叫, 因此必須傳遞乙個名為系統呼叫號的引數來識別所需的系統呼叫,一般通過eax來傳遞這個引數。

系統呼叫處理程式與其他異常處理程式的結構類似,執行下列操作:

下圖是《深入理解linux核心》書中的乙個說明:

下面通過**來分析一下:

include void main(void)

上面**,通過c語言呼叫函式getpgid(),實現了getpgid系統呼叫。

結果如下:

結果如下:

getpgid()用來取得引數pid指定程序所屬的組識別碼。如果引數pid為0,則會取得目前程序的組識別碼。執行成功則返回組識別碼,如果有錯誤則返回-1,錯誤原因存於errno中。esrch 找不到符合引數pid指定的程序。

分析上面彙編**

"mov $0, %%ebx\n\t":
pid賦值給ebx,傳遞給系統呼叫服務程式。此處引數為0,表示當前程序。
"mov $0x84, %%eax\n\t"
將系統呼叫號,傳遞給eax

:"int $0x80\n\t"

觸發軟終端,程式進入核心態,執行系統呼叫處理函式

"mov %%eax, %0\n\t"

: "=m"(a)

系統呼叫結束,將結果賦值給a變數。

總結:1,作業系統通過系統分級,是不同層次有不同層次的許可權,極大的保護了系統的安全。

2,中斷是從使用者態切換到核心態的主要方式。

3,系統呼叫,使得非作業系統開發程式設計師,可以脫離硬體程式設計,寫出可移植性更強的**,並且加大了系統安全性。

Linux核心分析之四 系統呼叫的工作機制

linux核心分析 mooc課程 學過計算機作業系統的都知道,cpu工作時有兩種狀態,一種是使用者態,一種是核心態,使用者態意味著 訪問的範圍會受到限制,在32位x86的機器上,4g的記憶體裡,在使用者態的時候,只能訪問0x00000000 0xbfffffff的位址空間。而核心態則不受限制,可以訪...

Linux核心分析實驗4 系統呼叫

cpu工作狀態分為核心態與使用者態,他們的執行的指令的許可權不同,使用者態程式不能訪問0xb00000以後的的記憶體 虛擬記憶體 系統核心會提供一些系統呼叫,它們執行一些底層的,有關硬體的功能,出於安全與相容的考慮,使用者態程式無法訪問硬體,需要通過系統呼叫來實現一些功能,如獲取當前事件,在螢幕上顯...

linux核心分析四

使用庫函式api和c 中嵌入彙編 兩種方式使用同乙個系統呼叫,理解系統呼叫的工作機制。api 第一層是指libc中定義的api,這些api封裝了系統呼叫,使用int 0x80觸發乙個系統呼叫中斷 當然,並非所有的api都使用了系統呼叫,如完成數學加減運算的api就沒有使用系統呼叫 也有可能某個api...