Wrapper routine 透過 0x80 號中斷(軟體中斷)進入 kernel space,並且跳至 system call handler執行。由於透過軟體中斷即可達成呼叫 system call的目地,因此使用 assembly來寫程式時,我們也可以直接呼叫system call。
在產生軟體中斷前,我們必須告訴 Linux kernel 所要呼叫的 system call 編號,system call 的編號透過 %eax 暫存器來指定;若要傳遞參數,則是透過其它暫存器來傳遞。
參數傳遞與傳回值
Linux system call最多可傳遞6個參數,參數的傳遞是透過以下的暫存器來完成:
- %ebx:第1個參數。
- %ecx:第2個參數。
- %edx:第3個參數。
- %esi:第4個參數。
- %edi:第5個參數。
- %ebp:第6個參數(做臨時用途)。
System call 的編號由 %eax 暫存器指定。System call 的傳回值則是存放於 %eax 暫存器。請看以下的範例程式 hello.S。
.data msg: .ascii "Hello, World!\n" len = . – msg .text .global _start _start: # sys_write movl $len,%edx movl $msg,%ecx movl $1,%ebx movl $4,%eax int $0x80 # sys_exit movl $0,%ebx movl $1,%eax int $0x80
組譯與連結的方法為:
$ as -o hello.o hello.S
$ ld -s -o hello hello.o
透過 assembly 程式,我們便能來初步了解 x86 上的 system call 架構。
--jollen