linux系統呼叫分析

2021-07-05 00:03:19 字數 1970 閱讀 3783

一、系統呼叫:

1、由作業系統核心提供,使得使用者程式可以訪問硬體裝置和其它作業系統資源,即為使用者空間提供一種硬體的抽象介面;

2、程式中所有與系統有關的**的實現都必須通過這些介面來完成,保證了系統的安全與穩定;

3、對於使用者空間的程序,在一般情況下是通過應用程式設計介面(api)而不是系統呼叫來進行程式設計,有些api往往直接封裝了系統呼叫,

但這並不意味著兩者是一一對應的。當前最流行的api是基於posix標準的。

4、系統呼叫涉及的兩個檔案:   /usr/src/linux/include/asm/unistd.h:系統呼叫號

/usr/src/linux/arch/x86/kernel/entry_32.s: 系統呼叫的彙編實現

二、at&t嵌入式彙編掃盲

i 、和intelx86彙編的區別:

1、立即數之前要加$符號;

2、 暫存器前要加%;

3、()表示用括號內的值作為位址進行間接定址;

4、*表示取出該位址下的內容;

5、格式為: 指令  源運算元 -> 目的運算元

ii、gnu c語言中嵌入彙編**的常見格式如下:

__asm__ volatile ("int $0x80" 

: "=a" (__res) 

: "0" (__nr_##name), "b" ((long)(arg1)),"c" ((long)(arg2)), 

"d" ((long)(arg3))); 

各種符號的含義如下:

__asm__: 嵌入彙編標誌,語句之間使用「;」、「\n」或「\n\t」分開 ,指令中的運算元可以使用佔位符引用c語言變數 %0-%9,

為了與此佔位符區分,暫存器前應該加%%,如%%eax;

"=a" (__res):將呼叫int 0x80之後暫存器eax作為返回值傳給變數__res,  每個輸出運算元的限定字串必須包含「=」表示他是乙個輸出運算元;

"0" (__nr_##name):將__nr_與變數name做字串拼接後傳給暫存器eax作為呼叫int 0x80的引數;

"b" ((long)(arg1)):將變數arg1強轉化成long型變數後傳給暫存器ebx作為呼叫int 0x80的引數;

其餘的字元與彙編中暫存器之間的關係如下表:

「s」:  暫存器esi「d」: 暫存器edi

「d」:  暫存器edx「c」: 暫存器ecx

三、系統呼叫過程原始碼分析:

i、__syscalln()巨集,其中n表示引數的個數。

以__syscall1為例:

#define _syscall1(type,name,type1,arg1) \

type name(type1 arg1) \

ii、entry.s原始碼輪廓[hint: 核心版本為2.6.38]

1、首先int 0x80中斷會被系統處理,呼叫到entry(system_call);

2、執行到syscall_call,執行對應的系統呼叫;   //主要任務也是我們關心的任務在此完成。

3、執行syscall_exit,可能跳轉到syscall_exit_work;

4、執行syscall_exit_work,可能跳轉到work_pending,也可能跳轉到resume_userspace;

5、執行resume_userspace,如果還有工作要做則跳轉到work_pending;

6、執行work_pending,如果有pending的訊號則呼叫訊號處理,然後跳到resume_userspace;

7、執行resume_userspace,如果還有工作要做則跳轉到work_pending;

8、執行work_pending,此時沒有訊號要處理,再看是否還有工作要完成,如果沒有了跳到restore_all, 如果還有工作要做,則看是否需要進行程序排程;

9、執行restore_all,最終呼叫iret指令返回到使用者態;

Linux系統呼叫分析

參照系統呼叫表 選擇alrm定時器系統呼叫 c語言 為 1 include 2 include 3 include 45 void alarm handler int signo 6 910 int main 11 內嵌彙編 格式為 1 include 2 include 3 include 45 ...

Linux系統呼叫分析

在linux 5.0.1目錄下 在linux 5.0.1目錄下 在linux 5.0.1目錄下 我的學號是372,取最後2位相同的為sigsuspend 函式,如下圖所示 72號程序為中斷,正常demo中尚可通過強制中斷來傳送乙個中斷訊號使該函式觸發,但在gdb除錯中無法觸發中斷訊號因此無法觸發該函...

Linux核心分析四 系統呼叫

linux核心分析四 系統呼叫 本文是 linux核心分析 課程的第四次作業,作者劉洋為您奉上。本次課程分別通過c語言和組合語言實現同乙個系統呼叫,來理解linux系統呼叫。作業系統為在使用者態執行的程序與硬體設別之間進行互動提供了一組介面,這種分層的設計能夠帶來很多優點。首先,把使用者從底層硬體開...