linux核心之系統呼叫
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核心之系統呼叫
1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙個唯一的系統呼叫號,如果系...
Linux核心學習之系統呼叫
文章參考linux核心修煉之道。1.系統呼叫概念 大家都知道作業系統的作用是管理計算機的軟硬體資源,但是作業系統要向使用者提供各種各樣的服務,而使用者應用程式訪問這些服務的方式就是通過系統呼叫。但是一般來說,我們都是通過作業系統封裝好的api 應用程式設計介面 來間接使用系統呼叫的。比如在windo...