Linux核心之系統呼叫

2021-09-30 09:13:36 字數 843 閱讀 2610

1. 應用程式通過api而不是直接呼叫系統呼叫來程式設計;

2. getpid()系統呼叫示例:

asmlinkage long sys_getpid(void)

asmlinkage 編譯器僅從棧中提取引數

系統呼叫的命名規則:sys_syscallname()

3. 每個系統呼叫都對應乙個唯一的系統呼叫號,如果系統呼叫被刪除,但它占用的系統呼叫號不**。

4. 系統呼叫通過軟中斷實現(int $0x80),通過引發乙個異常陷入懂啊核心態去執行異常處理程式system_call。最近的x86處理器已經支援了sysenter指令。

5. 引數和返回值通過暫存器來傳遞。

6. 指標引數的合法性驗證:

(1)指標指向的記憶體區屬於使用者空間;

(2)指標指向的記憶體區在程序的位址空間裡;

(3)指標指向的記憶體區必須被標記為可讀(讀)/可寫(寫)。

系統提供了兩個方法來完成核心空間與使用者空間的資料拷貝:copy_to_user()和copy_from_user()。

7. 核心執行系統呼叫的時候處於核心上下文,此時核心可以休眠並可以被搶占。

8. 系統呼叫必須編譯進核心映像,不能編譯成模組。

9. 通常通過c庫來使用系統呼叫(包含標頭檔案並鏈結相應的庫),但也可以通過巨集來直接訪問系統呼叫,如open()的呼叫:

先通過下面的巨集將系統呼叫擴充套件為內嵌彙編的c函式:

#define_nr_open 5

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

這樣,應用程式就可以直接使用open()了。

**<>

linux核心之系統呼叫

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

Linux核心之系統呼叫

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

Linux核心學習之系統呼叫

文章參考linux核心修煉之道。1.系統呼叫概念 大家都知道作業系統的作用是管理計算機的軟硬體資源,但是作業系統要向使用者提供各種各樣的服務,而使用者應用程式訪問這些服務的方式就是通過系統呼叫。但是一般來說,我們都是通過作業系統封裝好的api 應用程式設計介面 來間接使用系統呼叫的。比如在windo...