使用者空間-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,包括...