当用户发出系统调用时,会触发一个中断,将执行切换到内核模式,然后执行负责系统调用执行的中断处理程序。现在我相信这个中断处理程序(以及所有其他中断处理程序)是内核的一部分。
但是系统调用实现(例如:将数据写入文件的指令或打开套接字的指令)又如何呢?这些指令是否被视为内核的一部分,或者它们是操作系统的一部分但在操作系统之外?内核?
答案1
实现系统调用的方法有很多种,虽然“软件中断”(陷阱)是其中之一,已经使用并且仍在使用,但还有其他方法,例如指令syscall
(参见例如这里了解更多详细信息)。
所以系统调用是调用内核代码的一种方式。被调用的代码肯定是内核的一部分。调用代码位于用户空间(显然),并且通常是库的一部分(例如libc
)。
“X 是 Y 的一部分”这个问题主要取决于您对 Y 的定义。定义“内核”、“操作系统”和“是……的一部分”的含义(不同的人以不同的方式定义它),然后您就会能够说“系统调用是内核或操作系统的一部分”。
更好的思考方式是系统调用为内核代码定义 API(应用程序编程接口)。因此,它们与内核(有时是内核的特定版本)紧密耦合。
答案2
但是系统调用的实现(例如:将数据写入文件的指令或打开套接字的指令)又如何呢?这些指令是否被视为内核的一部分?
它们是内核的一部分。
但我怀疑你可能需要一些参考资料来支持这个断言
系统调用的源代码read()
在这里:linux-5.0/fs/read_write.c:571
显然,如果您想找到从特定文件系统读取的源代码,您将必须追踪许多函数调用:-)。
所有这些代码都内置到内核映像中,或者内置到可以按需加载的模块中,以成为正在运行的内核的一部分。 Linux 支持多种不同的文件系统类型,因此它们通常构建为模块。
您可能正在使用ext4
文件vfat
系统。您可以使用查看已加载的内核模块的列表lsmod
。
在我的 Fedora 29 系统上,ext4
它是内核映像的一部分,但是vfat
是一个可加载模块。所以lsmod
不显示ext4
。但是modprobe --show-depends ext4
告诉我“内置 ext4”。
手册页: