需要一些系統調用

需要一些系統調用

我非常了解系統呼叫的工作原理以及系統呼叫的一般需求。但是,我不明白為什麼像 create() file、read() file 和 close() 這樣的系統呼叫只能在核心模式下執行。

例如在create()和read()檔案中,為什麼它不能在使用者空間或使用者模式中發生?使用者如何可能透過建立和讀取檔案來損壞系統?我對 close() 系統呼叫也有同樣的疑問。

答案1

我不明白為什麼像 create() file、read() file 和 close() 這樣的系統呼叫只能在核心模式下執行。

嗯,根據定義,系統呼叫是在核心模式下執行的。在使用者空間中,這些通常可以透過具有相同名稱的庫包裝函數來使用。從man 2 intro

系統呼叫是 Linux 核心的入口點。通常,系統呼叫不是直接呼叫的:相反,大多數系統呼叫都有相應的 C 庫包裝函數,這些函數執行呼叫系統呼叫所需的步驟(例如,捕獲到核心模式)。因此,進行系統呼叫看起來與呼叫普通函式庫函數相同。

(也可以看看man 2 syscall

正如 @dirkt 和 @StephenKitt 在評論中所說,您提到的系統呼叫需要在核心空間中運行,因為它們必須在檔案描述符表上寫入、存取檔案 I/O 驅動程式、驗證存取權限等。

答案2

例如在create()read()文件中,為什麼不能在用戶空間中發生?

在某些平台(包括基於 Linux 的平台)上,很可能會從使用者空間運行檔案系統 IO。它被稱為 FUSE,您可以閱讀使用者空間中的檔案系統對該主題的介紹。

有許多基於 FUSE 的檔案系統可用,包括SSHFS(檔案系統ssh)和S3QL(雲端儲存上的檔案系統)。

核心調解用戶空間用戶端(應用程式)和 FUSE 實作之間的層,以便檔案系統語義經過驗證且一致,但creat()open()read()write()fcntl()close()等的實際 IO 程式碼均由用戶運行- 空間服務。

相關內容