例析Linux系統呼叫的機制

2021-06-29 09:48:16 字數 1012 閱讀 1146

董濤

《linux核心分析》mooc課程

基於實驗樓**提供的《linux核心分析》實驗平台,以庫函式uid_t getuid()和c**中嵌入彙編**兩種方式,返回乙個呼叫程式的真實使用者id,並在此基礎上,仔細分析彙編**呼叫系統呼叫的工作過程。

首先,建立包含getuid()函式的getuid.c檔案和包含彙編**的檔案getuid_asm.c,兩個檔案的截圖如下所示:

將這兩個程式檔案分別使用gcc命令編譯成可執行檔案,然後執行,先來看一下執行的結果,截圖如下:

可見,這兩個程式都返回了使用者id1000,執行正確。下面來分析一下這兩個程式的執行機制,從而理解作業系統對系統呼叫的呼叫:

對包含庫函式的getuid.c程式,程式在執行中通過呼叫庫函式uid=getuid()獲得了使用者的id並賦值給變數uid,在這一過程中,庫函式使用了24號封裝例程,使得使用者不用考慮硬體層面的細節,這一過程將和下面我們要分析的包含彙編**的程式形成對比。

對於包含彙編**的getuid_asm.c程式,其彙編**及其注釋如下:

asm volatile(

"mov $0x0,%%ebx\n\t"         \\系統呼叫的第乙個引數時ebx,這裡是null

"mov $0x18,%%eax\n\t"       \\將24號系統呼叫,即16進製制的18號系統呼叫作為引數,存放到引數傳遞暫存器eax中

"int $0x80\n\t"                         \\使用中斷呼叫系統呼叫;

"mov %%eax,%0\n\t"            \*系統呼叫返回值放在eax中,並將eax中的值賦給0號變數,即記憶體中的uid變數

:"=m"(uid)                                *\

好了,至此我們大致了解了作業系統系統呼叫的機制,在使用庫函式的時候,庫函式通過使用系統呼叫的封裝例程來實現系統呼叫,在不使用庫函式的時候,程式通過系統呼叫入口點system_call進入系統呼叫,然後根據系統呼叫引數實現具體的呼叫,最終將計算結果返回給主程式。

系統呼叫的工作機制

談起系統呼叫,不得不提一下linux下對檔案操作的兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思,面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採...

Windows系統呼叫機制

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

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

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