Linux 系統呼叫流程
假設執行了 fork() 這個系統呼叫,在 Linux 下是使用 int 0x80 做中斷,實際上呼叫了 system_call 這個函式。在 system_call 函式中再根據 eax 的值,來呼叫對應到的 sys_fork()。
在 system_call() 被呼叫之前,CPU 必需將使用者正在執行的 thread 的 register 存下來,這些 register 包含 SS/ESP(指出使用者堆疊的位置。kernel 與 user space 的 stack 不同,故要切換)、EFLAGS、CS/EIP(指出使用者代碼位置,醬子待會就可以 resume)。
因此系統呼叫的步驟為:
1. 切換堆疊
2. int 80,根據中斷向量表中來呼叫 system_call()
3. system_call() 根據 eax 的值,呼叫相對應的 sys_* 函式
4. 執行 iret,會將堆疊回復,便切回 user space
留言
張貼留言