我非常了解系统调用的工作原理以及系统调用的一般需求。但是,我不明白为什么某些系统调用(如 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 代码均由用户运行- 空间服务。