呼叫 系統呼叫函式write 的兩種實現

2021-09-02 22:46:29 字數 2076 閱讀 2768

我們知道呼叫「系統呼叫」有兩種方式。

( 1) 將系統呼叫指令封裝為 c庫函式,通過庫函式進行系統呼叫,操作簡單。

(2)不依賴任何庫函式,直接通過彙編指令 int與作業系統通訊。

我們平常寫的c語言用的就是第一種系統呼叫,通過函式呼叫write函式,我們下面用組合語言來重寫一下,利用我們定義的simu_write函式來更好的**write函式的運作機理

syscall.s

section .data

str_c_lib: db "c library says: hello world",0xa

str_c_lib_len equ $-str_c_lib

section .text

global _start

_start:

;;;模擬c語言;;

push str_c_lib_len

push str_c_lib

push 1 ;是push到標準輸出,也是乙個引數

call simu_write

add esp,12

;;;退出程式,不然會出現段錯誤;;

我們簡單的來解釋一下這一種方法:其先通過函式呼叫約定,從右向左往棧中壓入引數str_c_lib_len,str_c_lib,1,(write(1,str_c_lib,str_c_lib_len))然後呼叫simu_write函式

在我們的simu_write函式中先儲存舊的ebp,然後呼叫第4號子功能:write系統呼叫,將其存放在eax中,然後分別放入引數。這裡也就是我們所說的第二種系統呼叫了,不過我們先不在這裡說,在下乙個程式中說。

完成這些後,通過

mov eax,1

int 0x80

退出程式。其中第1號子功能是exit

int 0x80 發起中斷,通知 linux完成請求的功能,即完成退出請求

好,讓我們來看第二種方法,繞過庫函式,直接與os通訊

預備知識:

系統呼叫輸入引數的傳遞方式:

當輸入的引數小於等於 5 個時, linux 用暫存器傳遞引數。當引數個數大於 5 個時,把引數按照順序 放入連續的記憶體區域,並將該區域的首位址放到 ebx 暫存器。這裡我們只演示引數小於等於 5 個的情況。 eax暫存器用來儲存子功能號(暫存器 eip、 ebp、 esp是不能使用的)。 5個引數存放在以下暫存器中,

傳送引數的順序如下。

(1) ebx儲存第 1個引數。

(2) ecx儲存第 2個引數。

(3) edx儲存第 3個引數。

(4) esi儲存第 4個引數。

(5) edi儲存第 5個引數。

程式如下:

是不是發現不用庫函式,直接進行系統呼叫很簡單呢~嘻嘻,我們今天就到此為止了

Linux VFS中write系統呼叫實現原理

目錄 使用者空間的 write 函式在核心裡面的服務例程為 sys write.1 vfs write 函式實現原理 2 word裡面的目錄複製過來似乎不能直接用。還是放在這裡當主線看吧.使用者空間的 write 函式在核心裡面的服務例程為 sys write root syslab grep wr...

系統呼叫 函式呼叫

linux下對檔案操作有兩種方式 提供了庫函式,如open close read write ioctl 等,需包含標頭檔案unistd.h。以write 函式為例 其函式原型為size t write int fd,const void buf,size t nbytes 其操作物件為檔案控制代碼...

Linux檔案程式設計之 系統呼叫 write

1 相關函式說明 函式原型 int write int fd,const void buf,size t count 相關函式 open,read,fcntl,close,lseek,sync,fsync,fwrite 表頭檔案 include 函式說明 從buf所指向的緩衝區中,取出count個位...