我非常了解系统调用的工作原理以及一般系统调用的需求。但是,我不明白为什么像 create() file、read() file 和 close() 这样的系统调用只能在内核模式下执行。
例如在 create() 和 read() 文件中,为什么它不能发生在用户空间或用户模式中?用户如何通过创建和读取文件来损坏系统?在 close() 系统调用的情况下,我也有同样的疑问。
我非常了解系统调用的工作原理以及一般系统调用的需求。但是,我不明白为什么像 create() file、read() file 和 close() 这样的系统调用只能在内核模式下执行。
例如在 create() 和 read() 文件中,为什么它不能发生在用户空间或用户模式中?用户如何通过创建和读取文件来损坏系统?在 close() 系统调用的情况下,我也有同样的疑问。
好吧,根据定义,系统调用是在内核模式下执行的。在用户空间中,这些通常可以通过具有相同名称的库包装函数获得。来自
man 2 intro
:(另见
man 2 syscall
)正如@dirkt 和@StephenKitt 在评论中所说,您提到的系统调用需要在内核空间中运行,因为它们必须写入文件描述符表,访问文件 I/O 的驱动程序,验证访问权限等。
在某些平台(包括基于 Linux 的平台)上,很有可能从用户空间运行文件系统 IO。它被称为 FUSE,您可以阅读用户空间中的文件系统以了解该主题的介绍。
有许多基于 FUSE 的文件系统可用,包括SSHFS(基于文件系统
ssh
)和S3QL(基于云存储的文件系统)。内核调解用户空间客户端(应用程序)和 FUSE 实现之间的层,以便文件系统语义得到验证和一致,但实际的 IO 代码
creat()
,open()
,read()
,write()
,fcntl()
,close()
等都是从用户运行的-空间服务。