一、系統調用的概念
現代操作系統,處理器的運行模式通常分成兩個空間:一個內核空間,一個用戶空間。大部分的應用程序都是運行在用戶空間的,而內核和設備驅動程序運行在內核空間。如果應用程序需要訪問硬件資源或者需要內核提供服務時,就需要通過系統調用來實現。如圖爲系統架構:
二、系統調用有什麼作用
1、爲用戶空間程序提供一層硬件抽象接口。應用程序在讀寫一個文件時,無需關心底層硬件信息。
2、保證系統穩定和安全。
3、可移植性。可以讓應用程序在不加修改下,可以在不同的操作系統或者不同的硬件體系結構的系統中重新編譯運行。
三、系統調用實現原理
linux系統用一個文件來維護系統調用號。系 統 調 用 號 的 定 義 是 實 現 在arch/arm/include/uapi/asm/unistd.h 頭文件中。
我們知道open對應的系統調用函數是sys_open,那麼內核是如何知道這個函數的呢?在 arch/arm/kernel/calls.S 彙編中,通過 CALL 宏來定義具體的系統調用要實現的接口函數
最後, 在 arch/arm/kernel/sys_arm.c 文件中實現對應的系統函數接口。還有一個問題:自己增加的系統調用函數,誰來調用呢?直接使用 libc 中 syscall 函數來調用我們新加的系統調用函數。
相信到這裏,應該就可以自己寫一個簡單的系統調用函數了:
1、在arch/arm/include/uapi/asm/unistd.h 頭文件中增加一項
2、在 arch/arm/include/asm/unistd.h 頭文件中修改全局變量__NR_syscalls,__NR_syscalls 表示一共有多少的系統調用
3、在 arch/arm/kernel/calls.S 彙編中增加函數接口
4、在 arch/arm/kernel/sys_arm.c 文件中實現函數
5、在應用程序中調用syscall();