Linux 系統呼叫

2021-08-19 22:49:40 字數 2559 閱讀 9503

計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系統提供的系統呼叫(system call)。

系統呼叫是屬於作業系統核心的一部分的,必須以某種方式提供給程序讓它們去呼叫。cpu可以在不同的特權級別下執行,而相應的作業系統也有不同的執行級別,使用者態和核心態。執行在核心態的程序可以毫無限制的訪問各種資源,而在使用者態下的使用者程序的各種操作都有著限制,比如不能隨意的訪問記憶體、不能開閉中斷以及切換執行的特權級別。顯然,屬於核心的系統呼叫一定是執行在核心態下,但是如何切換到核心態呢?

作業系統一般是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求cpu暫停當前的工作,去處理更重要的事情。比如,在x86機器上可以通過int指令進行軟體中斷,而在磁碟完成讀寫操作後會向cpu發起硬體中斷。

中斷有兩個重要的屬性,中斷號和中斷處理程式。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程式。在作業系統核心中維護著乙個中斷向量表(interrupt vector table),這個陣列儲存了所有中斷處理程式的位址,而中斷號就是相應中斷在中斷向量表中的偏移量。

一般地,系統呼叫都是通過中斷實現的,比如,linux下中斷號0x80就是進行系統呼叫的。接下來就來看一下linux下系統呼叫具體的實現過程。

系統呼叫是通過軟中斷指令 int 0x80 實現的,而這條int 0x80指令就被封裝在c庫的函式中。

int 0x80 這條指令的執行會讓系統跳轉到乙個預設的核心空間位址,它指向系統呼叫處理程式。即system_call函式。

(注意:!系統呼叫處理程式system_call 並非系統呼叫服務例程,系統呼叫服務例程是對乙個詳細的系統呼叫的核心實現函式。而系統呼叫處理程式是在執行系統呼叫服務例程之前的乙個引導過程。是針對int 0x80這條指令,面向全部的系統呼叫的。

簡單來講,執行不論什麼系統呼叫。都是先通過呼叫c庫中的函式,這個函式裡面就會有軟中斷 int 0x80 語句。然後轉到執行系統呼叫處理程式 system_call ,

system_call 再依據詳細的系統呼叫號轉到執行詳細的系統呼叫服務例程。)

system_call函式是怎麼找到詳細的系統呼叫服務例程的呢?通過系統呼叫號查詢系統呼叫表sys_call_table!軟中斷指令int 0x80執行時,系統呼叫號會被放入 eax 暫存器中,system_call函式能夠讀取eax暫存器獲取,然後將其乘以4,生成偏移位址,然後以sys_call_table為基址。基址加上偏移位址,就能夠得到詳細的系統呼叫服務例程的位址了!

然後就到了系統呼叫服務例程了。

須要說明的是。系統呼叫服務例程僅僅會從堆疊裡獲取引數,所以在system_call執行前。會先將引數存放在暫存器中。system_call執行時會首先將這些暫存器壓入堆疊。

system_call退出後。使用者能夠從暫存器中獲得(被改動過的)引數。

另外:系統呼叫通過軟中斷int 0x80陷入核心。跳轉到系統呼叫處理程式system_call函式,然後執行對應的服務例程。可是因為是代表使用者程序,所以這個執行過程並不屬於中斷上下文,而是程序上下文。因此。系統呼叫執行過程中,能夠訪問使用者程序的很多資訊,能夠被其它程序搶占,能夠休眠。

當系統呼叫完畢後,把控制權交回到發起呼叫的使用者程序前。核心會有一次排程。

假設發現有優先順序更高的程序或當前程序的時間片用完,那麼會選擇優先順序更高的程序或又一次選擇程序執行。

linux核心中設定了一組用於實現系統功能的子程式,稱為系統呼叫。

系統呼叫和普通庫函式呼叫很相似,僅僅是系統呼叫由作業系統核心提供,執行於核心態。而普通的函式呼叫由函式庫或使用者自己提供。執行於使用者態。

一般的,程序是不能訪問核心的。它不能訪問核心所佔記憶體空間也不能呼叫核心函式。cpu硬體決定了這些(這就是為什麼它被稱作"保護模式")。為了和使用者空間上執行的程序進行互動,核心提供了一組介面。透過該介面,應用程式能夠訪問硬體裝置和其它作業系統資源。這組介面在應用程式和核心之間扮演了使者的角色,應用程式傳送各種請求。而核心負責滿足這些請求(或者讓應用程式臨時擱置)。

系統呼叫在使用者空間程序和硬體裝置之間加入了乙個中間層。該層主要作用有三個:

(1) 它為使用者空間提供了一種統一的硬體的抽象介面。

比方當須要讀些檔案的時候,應用程式就能夠不去管磁碟型別和介質,甚至不用去管檔案所在的檔案系統究竟是哪種型別。

(2)系統呼叫保證了系統的穩定和安全。作為硬體裝置和應用程式之間的中間人,核心能夠基於許可權和其它一些規則對須要進行的訪問進行裁決。

舉例來說,這樣能夠避免應用程式不對地使用硬體裝置,竊取其它程序的資源,或做出其它什麼危害系統的事情。

(3) 每乙個程序都執行在虛擬系統中,而在使用者空間和系統的其餘部分提供這樣一層公共介面。也是出於這樣的考慮。假設應用程式能夠任意訪問硬體而核心又對此一無所知的話,差點兒就沒法實現多工和虛擬記憶體,當然也不可能實現良好的穩定性和安全性。

在linux中。系統呼叫是使用者空間訪問核心的惟一手段。除異常和中斷外,它們是核心惟一的合法入口。

linux 系統呼叫

使用者應用可以通過兩種方式使用系統呼叫。第一種方式是通過c庫函式,包括系統呼叫在c庫中的封裝函式和其他普通函式。圖5.2 使用系統呼叫的兩種方式 第二種方式是使用 syscall巨集。2.6.18版本之前的核心,在include asm i386 unistd.h檔案中定義有7個 syscall巨集...

Linux系統呼叫

一 實驗目的和要求 1.學習linux核心的配置和編譯 2.深入理解linux系統呼叫 3.理解arm和x86的cpu模式 系統模式 使用者模式 的不同 4.掌握核心模組的編寫方法。二 實驗器材 1.linux實驗板卡一塊 2.5v 1a電源乙個 3.microusb線一根 4.macos一台 5....

Linux系統呼叫

linux系統呼叫 系統呼叫 system call 是使用者空間訪問核心的唯一手段,除異常和陷入外,他們是核心唯一的合法入口。通常情況下應用程式是通過應用程式設計介面api來訪問函式,而不是直接使用系統呼叫來程式設計。作業系統通常是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求c...