Linux核心筆記 系統呼叫

2021-10-02 05:09:22 字數 2091 閱讀 3523

使用者空間-syscall-硬體裝置

統一介面、穩定安全、易於管理

posix是介面標準

介面提供機制mechanism而不是策略policy

通常負的返回值表明錯誤,0正常。系統呼叫把錯誤情況寫入errno全域性變數。perror()函式翻譯為可理解的錯誤字串

asmlinkage long sys_callxx()

編譯指令,僅從棧中提取函式引數。 使用者空間int 核心空間long

系統呼叫號

使用系統呼叫號而不是名稱,呼叫號分配後不更改刪除不** sys_call_tablearch/i386/kernel/syscall_64.c

使用者空間-》 軟中斷 引發乙個異常 中斷號128 由int$0x80指令出發-》陷入核心態-》 128號異常處理程式(系統呼叫處理程式system_call() 程式用組合語言寫在entry_64.s)

指定恰當的系統呼叫

陷入核心態同時使用eax暫存器傳遞呼叫號,核心比較呼叫號與nr_syscalls 大於等於則返回-enosys,call *sys_call_table(,%rax,8)在表中將呼叫號*4 查詢

引數傳遞

在x86 32位中暫存器 ebx ecx edx esi edi 按照順序儲存前5個引數,此外通常eax暫存器儲存這些引數在使用者空間位址的指標

新增核心新的系統呼叫相對容易,設計與實現難。 系統呼叫的介面簡潔,引數盡可能少,需要穩定,少改動,越通用越好,向前向後相容。系統呼叫的目的可能不變,但是用法可能改變,不假設位元組長度和位元組序

引數驗證

其中最重要的一種是對使用者提供的指標進行檢查,在接受乙個使用者空間指標之前,檢查指標指向的記憶體區域屬於使用者空間且為程序的位址空間。對記憶體區域的訪問許可權進行檢查。

針對核心與使用者空間之間的資料來回拷貝提供兩種方法,其中乙個必須被使用

copy_to_user(程序空間目的位址,核心空間源位址, 資料長度)

copy_from_user(核心,程序,長度)

呼叫成功返回0,執行失敗返回沒能完成拷貝的資料位元組數,出現錯誤返回-efault

這兩個呼叫容易引起阻塞,使用者資料的頁換出記憶體,程序休眠,等待缺頁處理程式。

最後一項檢查合法許可權,capable(cap_sys_func)檢查 返回0 則無權操作。

核心在執行系統呼叫時處於程序上下文中,current指標指向引發系統呼叫的那個程序。當系統呼叫返回時控制權在system_call()中,負責切換到使用者空間並讓使用者程序繼續執行下去。

繫結乙個系統呼叫的最後步驟

編寫新的系統呼叫:

在系統呼叫表entry.s中最後加入乙個表項 ;系統呼叫表中的位置就是呼叫號.long sys_func#define _nr_func 呼叫號編譯到核心核心映像kernel/sys.c

asmlinkage long sys_func(args)

在呼叫表中加入名稱- 定義呼叫號 - 核心映像寫功能

從使用者空間訪問系統呼叫

在使用者空間可以使用巨集_syscalln()對系統呼叫直接訪問,0≤n≤6是傳給系統呼叫的引數個數

//long open(const char *filename,int flags , int mode)

#define nr_open 5

_syscall3

(long

, open,

const

char

*, filename,

int,flags,

int, mode)

//引數個數是2+2n 分別是對應型別和名稱

然後就可以在**內直接呼叫open()

為什麼不通過系統呼叫的方式實現利:

弊:呼叫syscall

註冊呼叫新的系統呼叫

Linux核心學習筆記四 系統呼叫

一 使用者空間和核心空間 linux核心將這4g位元組虛擬位址空間的空間分為兩部分 l 將最高的1g位元組 從虛擬位址0xc0000000到0xffffffff 供核心使用,稱為 核心空間 l 將較低的3g位元組 從虛擬位址 0x00000000到0xbfffffff 供各個程序使用,稱為 使用者空...

Linux核心學習筆記四 系統呼叫

一 使用者空間和核心空間 linux核心將這4g位元組虛擬位址空間的空間分為兩部分 l 將最高的1g位元組 從虛擬位址0xc0000000到0xffffffff 供核心使用,稱為 核心空間 l 將較低的3g位元組 從虛擬位址 0x00000000到0xbfffffff 供各個程序使用,稱為 使用者空...

Linux核心學習筆記(五) 系統呼叫

系統呼叫在使用者空間程序和硬體裝置之間新增了乙個中間層。作用 應用程式通過使用者空間實現的應用程式設計介面 api 而不是直接通過系統呼叫來程式設計。unix最流行的應用程式設計介面是基於posix標準的,posix定義的api函式和系統呼叫之間有著直接關係。c庫實現了unix系統的主要api,包括...