理解linux系統呼叫

2021-06-19 04:49:24 字數 1831 閱讀 2147

1.系統呼叫和普通函式完全不同,系統呼叫實際上是0x80號中斷對應的中斷處理程式的子程式。換句話說,在linux系統上,0x80中斷是系統呼叫的統一入口。某個具體的系統呼叫是這個中斷處理程式的子程式,進入具體某個系統呼叫是通過核心定義的系統呼叫號碼來實現的。linux通過執行如下彙編**陷入核心執行系統呼叫:

int 0x80; //這一句是進入系統呼叫統一入口。

2.每個系統呼叫在核心裡面都對應乙個號碼,這個號碼是在/usr/include/i386-linux-gnu/asm/unistd_32.h中定義的。如下圖,圖1所示

圖1 核心定義系統呼叫號碼

在執行"int 0x80;"進行中斷之前,應用層會做如下準備工作:

1.把系統呼叫號碼賦值給暫存器eax;

2.把系統呼叫需要的引數按次序賦值給暫存器ebx,ecx,edx等等。

這樣,等下0x80中斷發生的時候,系統呼叫需要的全部資訊就能通過這些暫存器傳遞給中斷處理程式了。

注:實際上系統呼叫需要的引數也可以使用應用程式的棧傳入核心。稍後實驗環節可以看到,這個不用太糾結。

如下圖圖2:

圖2 系統呼叫執行流程

原型:ssize_t write(int fd, const void *buf, size_t count);

例子:write(1,"abc\n",5); //往螢幕上列印"abc\n"。注意,buf裡面是5個字元,第5個是字串結尾0

1.根據/usr/include/i386-linux-gnu/asm/unistd_32.h的巨集定義,我們可以得出write()在linux上的系統呼叫號是4;

2.write()需要3個引數;

3.在應用層,把系統呼叫號4賦給eax。

movl $4, (%eax);

4.在應用層,把fd(1是螢幕輸出)賦給ebx。

movl $1, %ebx;

5.在應用層,把buf首位址賦給ecx。

movl $.lc0, %ecx (下面實驗環節可看到$.lc0對應buf首位址);

6.在應用層,把buf攜帶的有效資料長度賦給edx。

movl $5, %edx;

7.陷入核心,進入系統呼叫統一入口。

int $0x80;

8.核心執行write()系統呼叫;

9.系統呼叫返回。

1.原始c程式

圖3 write.c

c程式執行結果,如圖4

2.使用gcc將c程式編譯為彙編

gcc -s write.c

會生成write.s,彙編內容如圖5

圖5 write.s

直接編譯write.s,生成a.out,並執行。如圖6

圖63. 現在我們自己寫乙個

彙編mywrite.s,執行write系統呼叫。

彙編內容如圖7

圖7 mywrite.s

mywrite.s編譯後執行結果,如圖8

圖8 現在,我們成功使用int 0x80進行了系統呼叫。

Linux 系統呼叫理解

系統呼叫即為linux核心中設定的一組用於實現各種系統功能的子程式,作業系統通過系統呼叫為執行在其上的程序提供服務。由於程序一般不能訪問核心所佔記憶體空間以及呼叫核心函式,為了與使用者態程序進行互動,核心提供一組介面用於應用程式訪問。linux中系統呼叫是使用者空間訪問核心的唯一途徑,除了異常和中斷...

深入理解Linux系統呼叫

環境準備 1.安裝環境 1 sudo apt install build essential 2 sudo apt install qemu install qemu 3 sudo apt install libncurses5 dev bison flex libssl dev libelf de...

系統呼叫相關理解

系統呼叫是核心提供的使用者程序與核心進行互動的一組介面 是應用程式受限地訪問介面 提供了建立新程序並與已有程序進行通訊的機制 提供了申請作業系統其它資源的能力 是使用者訪問核心的唯一手段。主要是為了保證系統穩定可靠,避免應用程式肆意妄為。系統呼叫作為使用者空間程序和硬體裝置之間的中間層,主要作用有以...