使用庫函式api和c**中嵌入彙編**兩種方式使用同乙個系統呼叫,理解系統呼叫的工作機制。
api:第一層是指libc中定義的api,這些api封裝了系統呼叫,使用int 0x80觸發乙個系統呼叫中斷;當然,並非所有的api都使用了系統呼叫,如完成數學加減運算的api就沒有使用系統呼叫;也有可能某個api使用了多個系統呼叫;這一層存在的價值就是為應用程式設計師提供易於使用的api來呼叫系統呼叫;
system_call:執行於核心態。system_call是所有系統呼叫在核心的入口點,在其中的開始處保護使用者態程式執行上下文,結束處恢復使用者態程式執行上下文,在中間根據傳入的系統呼叫號對應的中斷服務程式;
sys_xyz 系統呼叫封裝例程:執行具體的系統呼叫操作,完成使用者的系統呼叫請求;每個系統呼叫都對應乙個封裝例程;
嵌入式彙編分析:
在linux系統中是通過啟用0x80中斷來觸發系統呼叫的,需要呼叫的系統呼叫號實現賦值給eax儲存器,如果有傳入引數可賦值給ebx暫存器,如果多於1個則按順序賦值給ebx、ecx、edx、esi、edi、ebp,如果超過6個則通過指標變數指向另一片堆疊區,如果無引數傳入則賦值為0。
首先將ebx暫存器清零,表示無引數傳入。
然後將0x2f(十進位制47)賦值給eax暫存器,表示需要呼叫的系統呼叫號,47為getgid。
執行int 0x80來執行系統呼叫。
之後eax暫存器儲存了返回值,將它分別賦值給輸出gid變數。
完成整個彙編**的系統呼叫。
Linux核心分析 實驗四
當我們使用某些庫函式的api時,實際上該庫函式啥都沒乾,它只是乙個系統呼叫的封裝。x86為例,系統呼叫會執行int 0x80指令,也就是陷入。作業系統會變為核心態,查詢系統呼叫表,跳轉到相應的系統呼叫。每個系統呼叫都對應乙個唯一的系統呼叫號,系統呼叫之前,會從eax暫存器讀系統呼叫號,系統呼叫的返回...
Linux核心分析四 系統呼叫
linux核心分析四 系統呼叫 本文是 linux核心分析 課程的第四次作業,作者劉洋為您奉上。本次課程分別通過c語言和組合語言實現同乙個系統呼叫,來理解linux系統呼叫。作業系統為在使用者態執行的程序與硬體設別之間進行互動提供了一組介面,這種分層的設計能夠帶來很多優點。首先,把使用者從底層硬體開...
網易雲課堂 Linux核心分析(四)
參見實驗報告 api和系統呼叫 系統呼叫通過軟中斷向核心發出乙個明確的請求 庫再用這些封裝例程定義出給使用者的api 不是每個api都對應乙個特定的系統呼叫 乙個單獨的api可能呼叫了幾個係用呼叫 不同的api可能呼叫同乙個系統呼叫 返回值 用呼叫程式及服務例程 傳參 核心實現了很多不同的系統呼叫,...