什麼是系統調用

定義:
        linux內核中設置了一組用於實現系統功能的子程序,成爲系統調用。系統調用和普通庫函數調用非常相似,只是系統調用由操作系統核心提供,運行於核心態,而普通的函數調用由函數庫或用戶自己提供,運行於用戶態。
系統調用提供在運行程序和操作系統之間的接口,通常以彙編語言指令形式提供。
用戶在程序中調用操作系統中的功能子模塊。或操作系統核心中設置了一組用於實現各種系統功能的子程序,提供用戶程序調用。

如何工作:
        一般的,進程是不能訪問內核的。它不能訪問內核所佔內存空間也不能調用內核函數。CPU硬件決定了這些(這就是爲什麼它被稱作"保護模式")。系統調用是這些規則的一個例外。其原理是進程先用適當的值填充寄存器,然後調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在Intel CPU中,這個由中斷0x80實現。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作爲操作系統的內核--所以你就可以爲所欲爲。 進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然後,它查看系統調用表 (sys_call_table)找到所調用的內核函數入口地址。接着,就調用函數,等返回後,做一些系統檢查,最後返回到進程(或到其他進程,如果這個進程時間用盡)。如果你希望讀這段代碼,它在<內核源碼目錄>/kernel/entry.S,Entry(system_call)的下一行。
什麼是errno:
        爲防止和正常的返回值混淆,系統調用並不直接返回錯誤碼,而是將錯誤碼放入一個名爲errno的全局變量中。如果一個系統調用失敗,你可以讀出errno的值來確定問題所在。
errno不同數值所代表的錯誤消息定義在errno.h中,你也可以通過命令"man 3 errno"來察看它們。
需要注意的是,errno的值只在函數發生錯誤時設置,如果函數不發生錯誤,errno的值就無定義,並不會被置爲0。另外,在處理errno前最好先把它的值存入另一個變量,因爲在錯誤處理過程中,即使像printf()這樣的函數出錯時也會改變errno的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章