图解Linux系统调用
在Linux下面,我們經常調用系統API來完成內核的操作,例如調用open打開一個文件。
這個過程看似簡單,其實已經包括了一次從用戶態到內核態,然后由內核態返回用戶態的過程。
當然用戶不會直接調用系統調用,而是調用glibc中的函數open打開文件。
在glibc中維護了一張表格,在syscalls.list里面,是c函數到系統調用的映射。
編譯的過程會將這個映射表格變成代碼。
真正調用系統調用的時候,會將參數放入CPU寄存器中,然后通過trap陷入內核,這里調用的是syscall。
ENTRY (syscall)
movq %rdi, %rax /* Syscall number -> rax. ?*/
movq %rsi, %rdi /* shift arg1 - arg5. ?*/
movq %rdx, %rsi
movq %rcx, %rdx
movq %r8, %r10
movq %r9, %r8
movq 8(%rsp),%r9 /* arg6 is on the stack. ?*/
syscall /* Do the system call. ?*/
cmpq $-4095, %rax /* Check %rax for error. ?*/
jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. ?*/
ret /* Return to caller. ?*/
在內核中,也是有一個sys_call_table數組的。
數組中的內容來自與syscall_64.tbl,這是一個文本,編譯的時候會將里面的系統調用名稱放入代碼中。
在內核中首先從CPU寄存器中拿到系統調用號,然后在這個表中查找open系統調用對應的內核函數,經過查抄對應的是sys_open,于是開始調用sys_open真正的打開一個文件。
總結
以上是生活随笔為你收集整理的图解Linux系统调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 业界 | 5个步骤开启你的数据科学职业生
- 下一篇: 图解Linux的Socket