系統呼叫(System Call)

2022-05-10 16:57:13 字數 2281 閱讀 3514

首先讓我們來看看《維基百科》中對系統呼叫的解釋:

系統呼叫,又名系統呼叫,是指執行在使用者空間的程式向作業系統核心請求更高許可權的服務。

從上面的例子我們可以知道,這只是乙個不算複雜的程式,但其中我們甚至可能用到了上千個系統呼叫,由此可見,系統呼叫與我們是息息相關的,但是對於大多數程式設計師而言,他們是看不到這些細節的,一般的程式開發人員都是根據程式介面設計程式而很少關心這些較為底層的東西。

一般會把系統呼叫劃分為五種型別:【程序控制】、【檔案管理】(例子中有出現)、【裝置管理】、【通訊】、【資訊管理】

下面讓我們一一來看看它們的一些特性:

程序控制

程序控制的主要功能是對程序的建立和刪除以及程序間狀態的轉換。如果建立乙個新作業或者程序,那麼我們能控制它們的執行和終止,能設定它們的屬性,包括作業的優先順序,最大等待時間等,如果發現其執行不正常或者不再需要它了,我們也可以終止。建立了乙個新的程序之後,可能需要一段時間來等待其完成,期間也有可能需要等待其他某個事件的出現,當事件出現後,才能完成。下面是乙個c程式庫呼叫:

在這一過程中,c程式呼叫了printf()語句,c程式庫攔截這個呼叫來呼叫乙個必要的系統呼叫[write()系統呼叫],並把write()的呼叫值返回給使用者。

檔案管理

讓我們看看一些常用的檔案系統呼叫。首先你需要建立和刪除檔案,建立檔案當然需要檔名了,這給使用者的提示就需要乙個系統呼叫,然後你還需要設定檔案的屬性什麼的,這也需要系統呼叫。一旦建立檔案成功,我們就需要開啟它並使用它,這一過程有讀、寫、重定位,操作結束後關閉它。如果你採用目錄結構來進行檔案管理,那麼目錄也需要同樣的操作。無論是檔案還是目錄,都需要設定其屬性,檔案的屬性包括檔名、檔案型別、保護模式、建立時間、最後一次訪問時間等。至少需要兩個系統呼叫(讀取檔案屬性和設定檔案屬性)來完成這個功能。如果需要完成檔案的複製和移動,就需要更多的系統呼叫。

裝置管理

乙個程式的執行過程中,肯定會用到各種各樣的資源,包括記憶體、磁碟、檔案的訪問等等,如果有足夠的資源,那麼程式就會正常的執行,否則的話程式必須等待足夠多的資源。作業系統的某些資源可以當做裝置來看待,比如有些是物理裝置(磁碟),而另外也有一些虛擬裝置(檔案)。在使用完裝置之後,使用者需要釋放它,這一過程類似於檔案管理裡邊的open和close的系統呼叫。事實上,我們在對待檔案和裝置上,可以採用同一套系統呼叫。

通訊

通訊分為兩種,一種是訊息傳遞模式,另一種是共享記憶體模式

對於訊息傳遞,通訊程序通常通過彼此間交換訊息來交換資訊,它們可能是同乙個cpu上的程序,也可能是通過網路連線的不同計算機上的的程序。不管是前者還是後者,都必須要知道另一方通訊實體的名稱,從而準確連線。前者比較容易,只需知道對方的程序名稱就ok,如果是後者該怎麼辦呢,我們知道每台計算機都有不同的主機名,而在網路上的主機一般都有自己的網路標識,如ip,它們通常會轉化成標誌符以便被系統呼叫。系統呼叫get hostid和get processid用於這一轉換,這些識別符號再傳遞給檔案裡的 通用的open connectionclose connection系統呼叫。接收方通常通過accept connection呼叫來允許通訊,在接受方後台有一些特殊的程式用於連線,它們執行wait for connection,當有連線的時候就會被喚醒。通訊源一般稱為客戶機,接受方則是伺服器。通過read messagewrite message系統呼叫來交換資訊。

來看看共享記憶體模式,程序通常可以通過shared memory creatshared memory attach系統呼叫來獲得其它程序所擁有的記憶體區域訪問權。我們知道作業系統是會限制乙個程序訪問另乙個程序的的記憶體的(可能會產生未知名的破壞),而共享記憶體模式裡則會要求兩個或者多個程序取消這一限制,從而可以通過讀寫公共區域來交換資訊。

資訊管理

很多的系統呼叫都是用於使用者和系統間傳遞訊息的。如返回當前的日期和時間、當前使用者數、作業系統資訊、記憶體的占有率等等。作業系統也負責維護程序的資訊,有些系統呼叫可以訪問這些資訊,也有的系統呼叫用於設定程序資訊的。

linux中system call中斷處理過程

上次我們分析了系統呼叫大致過程,現在我們把這兩個系統呼叫的 放到menuos中,並用gdb跟蹤除錯來看看從system call開始到iret結束之間的整個過程。邊看實驗過程邊分析 首先我們要將系統裡面的menu目錄刪去,然後從github上更新到新版的menu。接著,把我們之前寫好的getpid ...

分析system call中斷處理過程

linux 核心分析 mooc課程 上一次的實驗中,我們選擇了乙個系統呼叫即系統呼叫函式system write函式,分別使用庫函式 api即 printf 函式和c 中嵌入彙編 的方式進行了系統呼叫。我們先複習一下系統呼叫的原理和系統呼叫的過程。首先我們看一下課堂上孟寧老師給出的 系統呼叫三層皮 ...

systemcall標頭檔案巨集值定義

long syscall longnumber,syscall的第乙個引數number根據例子程式都是使用sys 定義的呢?根據man 2 syscall可以看到number是使用的 include 標頭檔案,裡面又 include 和 include 其中asm unistd.h裡面根據平台不同最...