1、glibc 對系統呼叫的封裝
int open(const char *pathname, int flags, mode_t mode)glibc 裡面的 open 函式
make-syscall.sh syscall-template.s
2、系統呼叫**
3、總結
- glibc 將系統呼叫封裝成更友好的介面
- 本節解析 glibc 函式如何呼叫到核心的 open
---- 使用者程序呼叫 open 函式
- glibc 的 syscal.list 列出 glibc 函式對應的系統呼叫
- glibc 的指令碼 make_syscall.sh 根據 syscal.list 生成對應的巨集定義(函式對映到系統呼叫)
- glibc 的 syscal-template.s 使用這些巨集, 定義了系統呼叫的呼叫方式(也是通過巨集)
- 其中會呼叫 do_call (也是乙個巨集), 32位與 64位實現不同
---- 32位 do_call (位於 i386 目錄下 sysdep.h)
- 將呼叫引數放入暫存器中, 由系統呼叫名得到系統呼叫號, 放入 eax
- 執行 enter_kernel(乙個巨集), 對應 int $0x80 觸發軟中斷, 進入核心
- 呼叫軟中斷處理函式 entry_int80_32(核心啟動時, 由 trap_init() 配置)
- entry_int80_32 將使用者態暫存器存入 pt_regs 中(儲存現場以及系統呼叫引數), 呼叫 do_syscall_32_iraq_on
- do_syscall_32_iraq_on 從 pt_regs 中取系統呼叫號(eax), 從系統呼叫表得到對應實現函式, 取 pt_regs 中儲存的引數, 呼叫系統呼叫
- entry_int80_32 呼叫 interrupt_ruturn(乙個巨集)對應 iret 指令, 系統呼叫結果存在 pt_regs 的 eax 位置, 根據 pt_regs 恢復使用者態程序
---- 64位 do_call (位於 x86_64 目錄下 sysdep.h)
- 通過系統呼叫名得到系統呼叫號, 存入 rax; 不同中斷, 執行 syscall 指令
- msr(特殊模組暫存器), 輔助完成某些功能(包括系統呼叫)
- trap_init() 會呼叫 cpu_init->syscall_init 設定該暫存器
- syscall 從 msr 暫存器中, 拿出函式位址進行呼叫, 即呼叫 entry_syscall_64
- entry_syscall_64 先儲存使用者態暫存器到 pt_regs 中
- 呼叫 entry_syscall64_slow_pat->do_syscall_64
- do_syscall_64 從 rax 取系統呼叫號, 從系統呼叫表得到對應實現函式, 取 pt_regs 中儲存的引數, 呼叫系統呼叫
- 返回執行 usergs_sysret64(乙個巨集), 對應執行 swapgs 和 sysretq 指令; 系統呼叫結果存在 pt_regs 的 ax 位置, 根據 pt_regs 恢復使用者態程序
---- 系統呼叫表 sys_call_table
- 32位 定義在 arch/x86/entry/syscalls/syscall_32.tbl
- 64位 定義在 arch/x86/entry/syscalls/syscall_64.tbl
- syscall_*.tbl 內容包括: 系統呼叫號, 系統呼叫名, 核心實現函式名(以 sys 開頭)
- 核心實現函式的宣告: include/linux/syscall.h
- 核心實現函式的實現: 某個 .c 檔案, 例如 sys_open 的實現在 fs/open.c
- .c 檔案中, 以巨集的方式替代函式名, 用多層巨集構建函式頭
- 編譯過程中, 通過 syscall_*.tbl 生成 unistd_*.h 檔案
- unistd_*.h 包含系統呼叫與實現函式的對應關係
- syscall_*.h include 了 unistd_*.h 標頭檔案, 並定義了系統呼叫表(陣列)
喜訊 祝賀公司寶新鄉分公司成立!
11 月 1 程式設計客棧日,公司寶新鄉分公司正式成立。這也是公司寶繼北京總部之外,於上海 廣州 杭州 成都 深圳 天津 開封等地成立分公司及關聯公司後,成立的又一家分公司。公司寶在完成北上廣深超一線城市業務覆蓋之後,將更多優秀服務產品推向全國各地城市,不斷提公升公司寶企業服務產品的價zsiri值。...
09 linux011系統呼叫開銷分析
1 int 80h 保護模式下執行int 80h指令的過程比較複雜 1 cpu 根據中斷號 80h 和 idtr idt記憶體位址 讀取描述符 idt 80h 並作有效 特權級等檢查 2 cpu 根據 idt 80h 描述符中的 gdt 選擇符 s 和 gdtr gdt記憶體位址 讀取段描述符 gd...
公司成立PMO的重要意義
pmo的全稱是專案管理辦公室,管理是這個部門的核心,其主要的物件是專案。那麼,公司成立pmo的重要意義是什麼呢?1 根據公司組織機構因素,專案統一管理,資源共享 翻開以往的專案記錄,能夠找到的資料極為少。各階段文件嚴重缺乏,導致類似專案在啟動時,只能是重新再來,無法借鑑以往專案的任何經驗之類的,唯一...