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

2021-08-20 23:33:34 字數 2614 閱讀 7584

系統呼叫在使用者空間程序和硬體裝置之間新增了乙個中間層。作用:

應用程式通過使用者空間實現的應用程式設計介面(api)而不是直接通過系統呼叫來程式設計。

unix最流行的應用程式設計介面是基於posix標準的,posix定義的api函式和系統呼叫之間有著直接關係。

c庫實現了unix系統的主要api,包括標準c庫函式和系統呼叫介面。

getpid()系統呼叫的實現:

syscall_define0(getpid)

syscall_define0是乙個巨集,定義乙個無引數(0)的系統呼叫,展開後如下:

asmlinkage long sys_getpid(void)
asmlinkage是乙個編譯指令,通知編譯器僅從棧中提取該函式的引數。所有系統呼叫都使用這個限定詞。sys_name()是linux系統系統呼叫的命名規則。

3.1 系統呼叫號

linux中,每個系統呼叫被賦予乙個系統呼叫號。

系統呼叫號分配後不能變更。如果乙個系統呼叫被刪除,它所占用的系統呼叫號不允許被**利用。

sys_ni_syscall()表示未實現系統呼叫,只返回-enosys,為無效的系統呼叫而設。

系統呼叫的列表儲存在sys_call_table中。

3.2 系統呼叫的效能

linux系統呼叫比其他作業系統執行的快。因為linux上下文切換時間很短,系統呼叫處理程式和每個系統呼叫本身非常簡潔。

使用者空間的程式無法直接執行核心**,不能直接呼叫核心空間的函式,因為核心駐留在受保護的位址空間上。

應用程式通過軟中斷通知核心執行系統呼叫,引發乙個異常來使系統切換到核心態去執行異常處理程式(系統呼叫處理程式)。

x86系統預定義的軟中斷為中斷號128,通過int $0x80指令觸發,執行異常處理程式system_call()。x86處理器新增指令sysenter,更快、更專業地陷入核心。

4.1 指定恰當的系統呼叫

x86系統上,系統呼叫號通過eax暫存器傳遞給核心。system_call()將系統呼叫號與nr_syscalls比較,大於或等於nr_syscalls返回-enosys。執行系統呼叫**:

call *sys_call_table(, %rax, 8);
系統呼叫表中表項以64位(8位元組)型別存放,x86-32系統上用4代替8。

4.2 引數傳遞

x86-32系統上,ebx、ecx、edx、esi和edi按照順序存放前五個引數。

給使用者空間的返回值存放在eax暫存器上。

5.1 實現系統呼叫

系統呼叫的介面應該簡潔,引數盡可能少,盡量為將來多做考慮。

標誌不是用來讓單個系統呼叫具有多個不同的行為,而是為了即使增加新的功能和選項,也不破壞向後相容或不需要的增加新的系統呼叫。

5.2 引數驗證

系統呼叫必須仔細檢查所有的引數是否合法有效。

例如在接收乙個使用者空間的指標之前,核心必須保證:

向使用者空間寫入資料,核心提供了copy_to_user()方法。第乙個引數是程序空間中的目的記憶體位址,第二個是核心空間內的源位址,最後乙個是需要拷貝的資料長度。

從使用者空間讀取資料,核心提供了copy_from_user()方法。把第二個引數指定位置上的資料拷貝到第乙個引數指定的位置上。

執行失敗,函式返回沒能完成拷貝的資料的位元組數。成功返回0。函式可能會引起阻塞。

核心會檢查是否有合法許可權。使用capable()函式來檢查是否有權對指定的資源進行操作,返回非0有權操作。

核心在執行系統呼叫的時候處於程序上下文。current指標指向引發系統呼叫的程序。

程序上下文中,核心可以休眠並且可以被搶占。能夠休眠說明系統呼叫可以使用核心提供的絕大部分功能;當前的程序可以被其他程序搶占,使用相同的系統呼叫時要保證系統呼叫時可重入的。

6.1 繫結系統呼叫

註冊正式的系統呼叫:

- 在系統呼叫表的最後加入乙個表項。系統呼叫號從0開始計算。

- 對於所支援的各種體系結構,系統呼叫號都必須定義於

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

linux使用_syscalln()巨集呼叫系統呼叫,其中n的範圍從0到6,代表需要傳遞給系統呼叫的引數個數:

//open()系統呼叫定義

long open(const

char *filename, int flags, int mode)

//使用系統呼叫的巨集的形式

#define nr_open 5

_syscall113(long, open, const

char*, filename, int, flags, int, mode)

第乙個引數是系統呼叫的返回值型別,第二個引數是系統呼叫的名稱,之後是系統呼叫每個引數的型別和名稱。

6.3 系統呼叫利弊

通常不通過系統呼叫的方式實現。

好處:

問題:

替代方法:

linux核心學習筆記

核心的配置 a.make s3c2410 deconfig b.make menuconfig 圖形化配置 c.使用廠家給出的配置 生成.config 編譯生成核心,使用如下命令 make vmlinux make uimage 帶頭部 真正核心 1 config 建立生成autoconf.h 供源...

Linux核心學習筆記

2.2 核心原始碼樹 arch 特定體系結構的原始碼 block crypto api crypto 核心原始碼文件 drivers 裝置驅動程式 firmware fs vfs和各種檔案系統 include 核心標頭檔案 init 核心引導和初始化 ipc 程序間通訊 kernel 像排程程式這樣...

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

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