Linux內核設計與實現 第五章

系統調用

作用:爲用戶空間提供一個管理接口;保證系統的安全;利於多任務和虛擬內存的實現。

系統調用

系統調用號:每個系統都有唯一的編號,即使該系統調用被刪除此編號也不能回收利用,進程在進行系統調用時直接使用系統調用號而不是系統調用的名字。

系統調用的性能:Linux中系統調用賊快:進程切換快,系統調用本身簡潔。

系統調用處理程序

用戶空間的程序無法直接執行內核代碼,所以必須通知內核自己需要執行一個系統調用,這樣的行爲是通過中斷來實現的。此時的異常處理程序其實就是系統調用處理程序:128中斷號被觸發後執行128號異常處理程序就是所謂的系統調用處理程序(system_call())——x86體系。

指定恰當的系統調用:在進行系統調用時還需要把系統調用號傳給內核,x86通過寄存器進行傳遞。

參數傳遞:x86-32前五個參數也是用寄存器傳遞,超過六個的話則用一個單獨的寄存器傳遞用戶空間的地址的指針。

系統調用的實現

參數驗證:最重要的一項就是檢查指針是否有效:指針必須指向用戶空間;讀寫操作必須擁有相應的權限:capable()。copy_from_user和copy_to_user都可能發生阻塞:比如缺頁。

系統調用上下文

current指針指向當前任務,也就是引發系統調用的那個進程 。內核可以休眠並且可以被搶佔。

綁定一個系統調用最後的步驟:編寫完一個系統調用後:系統調用表增加一個表項;定義系統調用號;被編譯進內核映象。

從用戶空間訪問系統調用:以系統調用open()爲例;

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

在不依靠libc庫支持的時候,我們選擇_syscalln(),

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

然而:在很多時候,添加一個新的系統調用是一個很方便的做法,但是在實際環境中儘量不要這麼做,具體原因這部分可以看一下書。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章