系統呼叫的工作機制

2021-07-10 14:50:39 字數 1713 閱讀 9005

談起系統呼叫,不得不提一下linux下對檔案操作的兩種方式:系統呼叫(system call)和庫函式呼叫(library functions)。系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思,面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,第一:雙緩衝技術的實現;第二,可移植性;第三,底層呼叫本身的一些效能方面的缺陷;第四:讓api也可以有了級別和專門的工作面向。

接下來我用乙個簡單的實驗,即使用庫函式api和c**中嵌入彙編**兩種方式使用同乙個系統呼叫來給大家展示下系統呼叫的工作機制:

首先編寫乙個簡單的c語言函式,其中包含了api函式getpid(),

然後再將它編譯成可執行檔案,並執行。

這時我們看到了系統呼叫後的結果,顯示了process pid:5185。

接下來,我們再用c**中嵌入彙編**來實現系統呼叫,以下是程式截圖,此處有點小問題,第一步應該是把暫存器ebx清零,系統呼叫的第乙個引數是通過暫存器ebx來傳遞的,因為getpid()函式沒有呼叫引數,所以需將暫存器ebx清零。

同樣再把它編譯成可執行檔案,並執行。

我們可以看到,這段程式同樣也可以完成系統呼叫,顯示結果為process pid:14477。

關於為什麼兩個顯示結果會不一樣,在此做個說明,因為計算機在不同時刻執行的程序是不一樣的,所以顯示的結果當然也是不同的程序號了。

接下來我們重點分析下這段彙編**:

"mov $0, %%ebx\n\t"    //這個指令是把暫存器ebx清零;

"mov $0x14,  %%eax\n\t"   //然後把系統呼叫號0x14放到暫存器eax中;

"int $0x80\n\t"    //這個指令是執行系統呼叫,類似於dos中的int  21h;

"mov %%eax, %0\n\t"  //把系統呼叫之後的返回值(此返回值存放在暫存器eax中)放入到引數pid中;

:"=m"(pid)    //"="表示運算元在指令中是只寫的,"m"表示記憶體變數,這條指令表示將pid的值寫入到記憶體中,而不是寄                       存器中; );

這裡要注意的是系統呼叫號是由暫存器eax來傳遞的。

最後我們來談談系統呼叫的過程,首先看下系統呼叫的過程,

首先我們需要在使用者態時將系統呼叫號放入到暫存器eax中,再由指令int 0x80進行系統呼叫,然後進入到核心態,以我的實驗為例,在核心態就會由sys_getpid函式來完成相關的功能,並將返回值返回到暫存器eax中,然後退出核心態系統呼叫,再退出核心態返回到使用者態。

實驗總結:

關於系統呼叫的工作機制,我們可以看到,系統呼叫可以用api函式直接呼叫或者在c語言中嵌入彙編**來進行呼叫,但兩者的本質是一樣的,都需要使用系統呼叫號,只不過api函式已經把系統呼叫號封裝起來了,與核心系統呼叫形成了對映關係。

《linux核心分析》mooc課程 」

作業四 系統呼叫的工作機制

系統呼叫列表參見一 前情提要 系統呼叫 作業系統為使用者態程序與硬體裝置進行互動提供了一組介面 api應用程式設計介面,是乙個函式定義。系統呼叫通過軟中斷向核心發出明確的請求。eg sysenter 作業系統提供api和系統呼叫的關係 一般每個系統呼叫對應乙個封裝例程。庫再用這些封裝例程定義給使用者...

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

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

Windows系統呼叫機制

記錄一下自己學習windows系統呼叫機制的過程。當呼叫乙個windows api時,系統會由使用者態切入到核心態,從ring3進入到ring0層。下面結合乙個例子來學習一下具體過程。這是乙個demo程式,只呼叫了createfile,我們用ollydbg看一下,它的具體流程是怎樣的。include...