Syscall (system call),中文翻成系統呼叫,可以把它理解成系統的 API (Application Programming Interface),目的是用來串接使用者與 kernel 空間。用一張圖(如下圖)可以解釋這個概念,Syscall 好比一道橋樑,用來將使用者空間的請求發送到 kernel 的空間。
舉例來說,以下是系統呼叫 sys_exit
mov eax, 2
int 0x80
先將 EAX 設定為2後(代表準備 fork),再呼叫 kernel 開始動作。再舉一個系統呼叫 sys_write 例子:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, 100
int 0x80
透過查表法(下表),先確定你要的動作需要哪些暫存器,再將其個別填入,即可完成呼叫該 Syscall。這裡的 EAX 填4,代表要輸出;EBX 填1代表是檔案描述符是 stdout;ECX 是你所想寫的資料;EDX 是資料長度。
常見的system call
不過我在寫的時候,有發現一個很特別的地方 - 32bits 與 64bits 的系統呼叫方式在 Mac OS 有些差異。比方說,同樣都是輸出的 Syscall,32bits 的程式是:
mov eax, 4
而 64bits 是:
mov rax, 0x2000004
64bits 就是要是比 32bits 多加了 0x2000000 XD
程式從寫完到編譯,到底經過了哪些流程?明日揭曉