搜尋
首頁後端開發PHP問題系統調用的目的是什麼

系統調用的目的是什麼

Jul 16, 2020 pm 05:44 PM
系統調用

系統呼叫的目的是:請求系統服務。作業系統不允許使用者直接操作各種硬體資源,因此使用者程式只能透過系統呼叫的方式來請求核心為其服務,間接地使用各種資源。

系統調用的目的是什麼

由作業系統提供的功能,通常應用程式本身是無法實現的。例如對檔案進行操作,應用程式必須透過系統呼叫才能做到,因為只有作業系統才具有直接管理週邊設備的權限。又如進程或執行緒間的同步互斥操作,也必需經由作業系統對核心變數進行維護才能完成。

從下到上看一個完整的電腦系統:實體硬體->OS核心->OS服務->應用程式。這裡的OS核心起到了「承上啟下」的關鍵作用,向下管理實體硬件,向上為作業系統服務和應用程式提供接口,這裡的接口就是系統呼叫了。

應用程式的程序通常在user模式下運行,當它呼叫一個系統呼叫時,進程進入kernel模式,執行的是kernel內部的程式碼,從而具有執行特權指令的權限,完成特定的功能。換句話說,系統呼叫是應用程式主動進入作業系統核心的入口。

一、系統呼叫與函式庫函數的差異

#函式庫函數

顧名思義是把函式放到函式庫裡,是把一些常用來的函數編完放到一個檔案裡,供別人用。別人用的時候把所在的檔名用#include加到裡面就可以了,通常放到lib檔裡。

函式庫函數主要由兩方面提供:一是作業系統提供的;另一類是由第三方提供的。

  • 系統提供的這些函數把系統呼叫進行封裝或組合,可以實現更多的功能,這樣的函式庫函數能夠實現一些對於核心來說比較複雜的操作。例如read函數根據參數,直接就能讀文件,而背後隱藏的文件例如在那個磁軌,那個扇區,載入到那個內存,是程式設計師不必關心的問題。這些操作裡面也包含了系統呼叫。例如write()這個系統函數,會呼叫同名的系統調用,來完成寫入操作。

  • 對於第三方函式庫,其實和系統函式庫一樣,只是他直接利用系統呼叫的可能性要小一些,而是系統提供的API介面來是實作。例如printf,實際上呼叫了write()這個系統函數。第三方函式庫函數大部分是系統函數的封裝。

系統呼叫與函式庫函數的連結:

事實上,系統呼叫所提供給使用者的是直接而純碎的高級服務,如果想要更加人性化,具有更符合特定情況的功能,那麼就要我們用戶自己定義,因此衍生了庫函數,它把部分系統調用包裝起來。例如當我們要用C語言印出一句話的時候,如果沒有用到函式庫函數printf,那麼我們就需要自己實作就需要呼叫putc()和write()等這樣一些系​​統函數。顯得比較麻煩,所以系統呼叫是為了方便使用作業系統的接口,而函式庫函數則是為了人們編程的方便。

例如,在Linux作業系統下,C語言的函式庫函數printf,實際上使用了write系統呼叫;而函式庫函數strcpy(字串拷貝)卻沒有使用任何系統呼叫。另外,一個系統的系統呼叫介面通常是能夠完成所有必需功能的最小集合,可能存在多個函式庫函數對同一個系統呼叫進行封裝。例如,在Linux中,malloc、calloc和free三個函式庫函數底層都是呼叫brk系統呼叫完成的。

應用程式、函式庫函數和系統呼叫的關係如下圖所示:

系統調用的目的是什麼

#系統呼叫和函式庫函數的差異:

函式庫函數的呼叫是語言或應用程式的一部分,而係統呼叫則是作業系統的一部分。

系統呼叫是應用程式與核心互動的介面。人們在長期的程式設計中發現使用系統函數有個重大的缺點,那就是程式的移植性。例如linux提供的系統呼叫的函數和windows就不一樣。

函式庫函數呼叫則是針對應用程式開發的,相當於應用程式的api,採用這樣的方式有很多原因:

  • 雙緩衝技術;(函式庫函數和系統調用兩層緩衝,減少系統呼叫次數)
  • 移植性(封裝了不同作業系統的系統函數,對外介面一致)
  • 底層呼叫本身存在的一些缺陷;
  • 讓api也可以有了層級和專門的工作面向;

二、CPU的核心模式與使用者模式

##############################################################################

通常,處理器設有兩種模式:“用戶模式”與“核心模式”,透過一個標籤位元來辨別目前正處於什麼模式。核心模式可以執行所有指令,包括特權指令(主要是一些硬體管理的指令,例如修改基址暫存器內容的指令) ,而使用者模式不能執行特權指令。這樣的設計主要為了安全問題,即由作業系統負責管理硬件,避免上層應用因錯誤設計而導致硬體問題。

既然只有作業系統能直接操作硬件,作業系統有必要提供介面來為應用程式提供使用硬體功能的入口,這些介面就被稱為系統呼叫。

當作業系統接收到系統呼叫請求後,會讓處理器進入核心模式,從而執行諸如I/O操作,修改基址暫存器內容等指令,而當處理完系統呼叫內容後,操作系統會讓處理器返回使用者模式,來執行使用者程式碼。

對應CPU的核心模式和使用者模式,進程運作的狀態分為管態(核心態)和目態(使用者態)。具體請看文章:作業系統--使用者狀態和核心狀態

四、系統呼叫和中斷的聯繫

中斷(Interrupt)通常是指在CPU內部或外部發生了某個待處理的事件,從而CPU必要改變當前指令的執行順序去處理這類事件。在介紹中斷和系統呼叫的關係之前,以下先把中斷做一個分類。

中斷可以大體分為兩大類:

  • Asynchronous interrupts(外中斷): 由CPU外部的其它硬體產生,說這類別中斷是異步的,意思是中斷訊號可以在任意時間發射,與CPU本身的時脈節拍沒有關係。如時鐘中斷,硬碟讀寫服務請求中斷等。

  • Synchronous interrupts(內中斷/異常):在CPU內部產生,說這類中斷是同步的,意思是中斷訊號的發射時間一定在當前指令執行結束之後。一般來自CPU的內部事件或程式執行中的事件,如非法操作碼、位址越界、浮點溢位等。

Synchronous interrupts (例外)又分為以下若干類別:

  • Processor-detected exceptions:處理器在執行指令時偵測到的中斷,如除零操作。

  • Faults:發生了某個異常條件,但異常條件被消除後,原來的程式流程可以繼續執行而不受任何影響,如缺頁異常。注意觸發中斷的指令會重新執行。

  • Traps:由陷入指令引起的中斷,通常用於程式偵錯。

  • Aborts:CPU內部有重要錯誤發生,例如硬體錯誤或系統表值發生錯誤。一旦這種中斷發生,錯誤將不可恢復,只能將目前程序終止。

  • Programmed exceptions:也稱為software interrupts (軟體中斷) ,由程式設計師的程式碼主動發起的中斷,用來實現系統調用。如在Linux中,就是用int 0x80指令實作系統呼叫。

至此,我們發現了中斷與系統呼叫的關係:系統呼叫是一種特殊的中斷類型(軟中斷)

五、核心對於系統呼叫的處理

#在x86的機器中,用一個8bit的數字(0~255)來區分各種中斷,這個數字稱為中斷向量(vector)。其中一個中斷向量,即128 (0x80),專門用來執行系統呼叫。

在Linux系統中,存有一個系統表,叫做Interrupt DescriptorTable,簡稱IDT。 IDT表共有256項,存放了從中斷向量到對應處理例程(interrupt or exceptionhandler)的映射關係。當某個中斷發生時,CPU從IDT表中查找到對應的處理例程的位址來執行。

系統呼叫的處理例程在IDT表中佔有一項。這一項是在trap_init函式中被初始化的,如下:set_system_gate(SYSCALL_VECTOR,&system_call);。如前所述,上面程式碼中的SYSCALL_VECTOR的值為128。

當系統呼叫發生時,透過中斷機制,系統呼叫例程system_call被呼叫。它的執行過程大概分為4個步驟:

1、從暫存器中取出系統呼叫號碼、輸入參數,然後將這些暫存器的值壓入kernel堆疊中。根據系統呼叫號碼尋找系統呼叫分派表(system call dispatch table),找到系統呼叫服務例程(一個核心函數)。

2、呼叫查到的系統呼叫服務例程。

3、將系統呼叫服務例程的回傳值出棧,重新儲存在暫存器中。

上面描述的系統呼叫例程system_call在kernel空間中執行。在執行前,系統呼叫號碼和輸入參數已經存入了暫存器,這個存入過程由user空間的程式碼完成。實際上,如同第一節所講,每個真正的系統呼叫基本上都有一個封裝它的函式庫函數,一般是在這個函式庫函數中完成系統呼叫號碼和輸入參數的保存動作。當系統呼叫例程system_call執行完畢後,傳回值會透過暫存器再傳回user空間的函式庫函數。

以上是系統調用的目的是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。