計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系統提供的系統呼叫。
系統呼叫是屬於作業系統核心的一部分的,必須以某種方式提供給程序讓它們去呼叫。cpu有著不同的執行級別,在這裡作業系統也有著執行級別:使用者態和核心態。
通俗的來講程序處於核心態時就是「boss」,這時他可以隨心所欲的使用和「霸佔」各種資源。
相對來講使用者態就是「下屬」,處於該級別的程序的操作限制多優先順序明顯低。
fork
open
read write
close等
fopen fread fwrite fclose ffflush等
標準io庫中預定義了三個流
stdin
標準輸入
stdout
標準輸出
stderr 標準錯誤
它們引用的檔案和stdin_fileno, stdout_fileno, stderr_fileno指向的檔案相同
標準io庫通過呼叫read/write系統呼叫
來實現真正的io。
linux下的系統呼叫是通過0x80實現的,但是我們知道作業系統會有多個系統呼叫(linux下有319個系統呼叫),而對於同乙個中斷號是如何處理多個不同的系統呼叫的?最簡單的方式是對於不同的系統呼叫採用不同的中斷號,但是中斷號明顯是一種稀缺資源,linux顯然不會這麼做;還有乙個問題就是系統呼叫是需要提供引數,並且具有返回值的,這些引數又是怎麼傳遞的?也就是說,對於系統呼叫我們要搞清楚兩點:
1. 系統呼叫的函式名稱轉換。
2. 系統呼叫的引數傳遞。
首先看第乙個問題。實際上,linux中處理系統呼叫的方式與
中斷類似。每個系統呼叫都有相應的
系統呼叫號
作為唯一的標識,
核心維護一張系統呼叫表
,表中的元素是系統呼叫函式的起始位址,而系統呼叫號就是系統呼叫在呼叫表的
偏移量。在進行系統呼叫是只要指定對應的系統呼叫號,就可以明確的要呼叫哪個系統呼叫,這就完成了系統呼叫的函式名稱的轉換。
假如linux中open的呼叫號是5
linux中是通過暫存器%eax傳遞系統呼叫號,所以具體呼叫open的過程是:將5存入%eax中,然後進行系統呼叫sys_open
完成操作。
對於引數傳遞,linux是通過暫存器完成的。
linux最多允許向系統呼叫傳遞6個引數,分別依次由%ebx,%ecx,%edx,%esi,%edi和%ebp這個6個暫存器完成。
如上圖2所示,linux中,在使用者態和核心態執行的程序使用的棧(空間)是不同的,分別叫做使用者空間和核心空間,兩者各自負責相應特權級別狀態下 的函式呼叫。當進行系統呼叫時,程序不僅要從使用者態切換到核心態,同時也要完成空間切換,這樣處於核心態的系統呼叫才能在核心空間上完成呼叫。系統呼叫返回時,還要切換回使用者空間,繼續完成使用者態下的函式呼叫。
系統呼叫很耗時耗資源原因在於倆點:
第一,系統呼叫通過中斷實現,需要完成棧切換。
第二,使用暫存器傳參,這需要額外的儲存和恢復的過程。
Linux 系統呼叫簡單了解
系統呼叫決定了作業系統是否好用,功能是否齊全。建立程序 fork 原程序叫父程序,新程序叫子程序。當父程序fork建立子程序時,採用寫時拷貝的方案。先是父子共用同一記憶體,如果有一方要寫資料,就會將該記憶體塊進行拷貝。然後再寫。fork可以根據返回值進行對父子程序的區分。子程序可以使用exec函式族...
Linux下簡單的系統呼叫
原創 2017年03月17日 21 31 20 本週是linux系統分析課程的第四周課程,本週主要講linux系統呼叫的過程,具體知識點和實驗結果總結如下。系統呼叫 系統呼叫只是乙個特殊的中斷。我們通過庫函式和系統呼叫打交道,庫函式把系統呼叫封裝起來。1 儲備知識 核心態和使用者態 核心態 在高執行...
Linux下select 系統呼叫
一 select 函式功能 select系統呼叫允許程式同時在多個底層檔案表述符上,等待輸入的到達或輸出的完成。二 函式意義 乙個伺服器可以同時在多個開啟的套接字等待請求到來的方法而處理多個客戶。只是具體應用的其中之一 自己的理解,但凡是程式在執行過程中會遇到阻塞 不到條件發生就不往下執行 的情況,...