系統調用:核心提供的使用者程式與核心進行互動的一組接口。
1. 與核心通信
主要作用:
1.1 對于應用程式:提供了通路應将的接口,提供了建立程序和程序間通信的機制,提供了申請操作心痛其他資源的能力。
1.2 對于作業系統:保證了系統的安全、穩定。
2. API、POSIX和C庫
2.1 API(應用程式設計接口):定義了一組應用程式使用的程式設計接口。
API與系統調用沒有直接對應關系。
2.2 POSIX::Unix世界中,最流行的API标準。
2.3 C庫:C庫實作了Unix系統的主要API,提供了POSIX的絕大數API
3. 系統調用
3.1 一般包括:輸入的參數,可能産生的副作用和一種明确的操作。
3.2 系統調用号:用來指明到底要執行哪個系統調用。
系統調用号獨一無二,不可變更,即使系統調用删除,系統調用号也不會回收。
sys_call_table:記錄了所有已經注冊過的系統調用的清單
4. 系統調用處理函數:system_call()
系統調用對應的軟中斷的異常處理函數:
應用程式通過軟中斷通知核心自己要執行一個系統調用,核心可以代表應用程式在核心空間執行。
4.1 指定恰當的系統調用:
通過寄存器,把系統調用号一并傳給核心。
4.2 參數傳遞
參數和傳回值一般通過寄存器傳遞,參數太多的情況下,可以用一個單獨的寄存器存放參數的使用者空間的位址
5.系統調用的實作
5.1 實作系統調用
用途:不提倡多用途的系統調用。
參數:很多系統調用通過标志參數確定向前相容
5.2 參數驗證:
(1)使用者傳入指針的檢查:記憶體區屬于使用者空間,在程序的位址空間,記憶體權限标記。
(2)核心無論何時都不能輕率的接受來自使用者空空間的指針,copy_to_user和copy_from_user必須其中一個被使用。
5.3 是否有合法權限。
6 系統調用上下文
6.1 綁定一個系統調用的最後步驟
(1)在系統調用表(sys_call_table)的最後加入一個表項
(2)定義系統調用号<asm/unistd.h>
(3)系統調用必須被編譯到核心映像
6.2 從使用者空間通路系統調用:
可以通過宏syscalln()直接對系統調用通路:
#define __NR_foo 283
__syscall0(long, foo)
直接就可以調用聲明好的foo()來調用系統調用foo()