天天看點

《Linux核心設計與實作》學習筆記3——系統調用

系統調用:核心提供的使用者程式與核心進行互動的一組接口。

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()

繼續閱讀