linux核心雜記 13 系統呼叫(1

2021-10-13 05:40:29 字數 2279 閱讀 1876

1、系統呼叫 在使用者空間程序和硬體 裝置之間增加了一具中間層。其作用如下:

(1)為使用者空間提供了一種硬體 的抽象介面。

(2)保證了系統的穩定 和安全

(3)每個程序 執行在虛擬系統中,而在使用者空間和系統的其餘部分提供這樣一層公共介面。

2、系統呼叫是使用者空間訪問核心的唯一手段,不能直接呼叫核心函式

3、一般情況下使用者程式通過在使用者空間實現的應用程式設計介面(api)而不是直接通過系統呼叫 來程式設計 。最流行的應用程式設計介面基於posix標準 。

4、訪問系統呼叫通常通過c庫中定義的函式呼叫 來進行。系統呼叫 在出現錯誤 時,c庫會所錯誤 碼寫入errno全域性變數,可通過perror()庫函式將該 變數翻譯成使用者可理解的錯誤字串。

5、系統呼叫 在核心中的實現舉例:

//get_pid:取得程序pid

//define0後面的0表示呼叫時引數為0

syscall_define0

(getpid)

syscall_define是乙個巨集,展開如下:

asmlinkage long

sys_getpid

(void

)

asmlinkage是乙個編譯指令,通知編譯器僅從棧中提取該函式的引數。所有系統呼叫 都需要這個限定詞

此外,注意:get_pid在核心定義為sys_getpid(),這是linux系統呼叫在核心定義時應遵守的命名規則。

6、每個系統呼叫 被 賦予乙個系統呼叫號,關聯唯一的系統呼叫。

7、sys_ni_syscall()為linux定義的乙個未實現的系統呼叫,即無效系統呼叫 ,只返回-enosys

8、核心在sys_call_table中記錄了系統呼叫表所有已經註冊過的系統呼叫的列表,在x86-64中,定義於arch/i386/kernel/syscall_64.c,為每個有效的系統呼叫指定了唯一的系統呼叫號。

9、核心空間的系統呼叫函式定義在受保護的位址空間中。呼叫核心的唯一方式是通知核心,靠軟中斷襪,在x86系統上預定義的軟中斷號128,通過int $0x80觸發該中斷 ,該指令會觸發乙個異常,並導致系統切換到核心態,執行128號異常處理程式(程式名字為system_call()),最近,x86處理器增加了一條sysenter指令,比軟中斷更快更專業。

10、系統呼叫的相關引數

(1)通過eax暫存器將系統呼叫號傳遞給核心。在陷入核心之前,使用者空間將相應系統呼叫對應的號放入eax中。

(2)system_call函式要檢查系統呼叫號的有效性,不然就是乙個無效系統呼叫。通過傳入的系統呼叫號與nr_syscalls比較來檢查有效性。大於或等於 nr_syscalls,該函式返回 -enosys,表示呼叫失敗,否則可繼續執行對應的系統呼叫:

call *

sys_call_table(,

%rax,

8)

sys_call_table在64位系統下,以64位(8位元組)存放,32位4位元組,上例中,最後乙個引數為8,表示為64位系統。

(3)通過其它暫存器傳遞引數。在x86-32系統上,ebx、ecx、edx 、esi、edi按順序 存放前5個引數,**如果需要6個或更多,則使用乙個單獨的暫存器存放放指向所有這些引數在使用者空間中的位址指標。

注意:系統呼叫號相關錯誤,返回-enosys

11 、系統呼叫實現

(1)實現新的系統呼叫 首先決定其用途,其次考慮介面設計,為將來多做考慮。然後,注意只是提供機制,不能提供策略,最後當寫乙個系統呼叫時,時刻注意可移植性和健壯性。

(2)系統呼叫實現時,必須驗證傳入引數的合法性,更重要是要驗證使用者提供的引數指標的有效性:

a.指標指向的記憶體區域屬於使用者空間

b.指標指向的記憶體區域在程序的位址空間

c.如果讀,該記憶體應被標記為可讀,如果寫,該記憶體應標記 可寫如果可執行,應標記為可執行。

(3)使用者空間的資料是不能直接使用,需要在核心空間和使用者空間進行來回copy

a.向使用者空間寫:

copy_to_user()

b.從使用者空間讀

copy_from_user()

c.最後乙個引數是需要copy的資料長度(位元組數)

d.發生錯誤返回 -efault

12、系統允許檢查針對 特定資源的特殊許可權,呼叫者可使用capable()函式來檢查是否有權對指定資源進行操作,返回非0表示有權,返回0表示無權。

具體返回值看

linux/capability.h

linux核心雜記 15 系統呼叫(2

1 核心在執行系統呼叫時,處於程序上下文狀態,current指標指向呼叫 系統呼叫的程序。2 在程序上下文中 1 核心可休眠 比如在系統呼叫阻塞或顯式呼叫 schedule 時 休眠說明系統呼叫可使用核心提供的絕大部分功能。2 核心可被搶占 就像使用者空間內的程序一樣,當前程序同樣可被其它程序搶占。...

linux核心之系統呼叫

應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...

Linux核心之系統呼叫

linux核心之系統呼叫 1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙...