【发布时间】:2018-11-10 14:15:54
【问题描述】:
我一直在阅读有关系统调用以及它们如何在 Linux 中工作的信息。我还有更多的阅读要做,但我没有回答的一件事是,为什么我们需要系统调用?
我知道系统调用是用户空间程序要求内核做某事的请求,但我的问题基本上是:为什么用户空间程序不能自己做这件事?为什么 Glibc 不做实际操作而只是作为系统调用的包装器?
例如,如果我在我的程序中调用fopen(),为什么glibc 调用open 系统调用?为什么 glibc 不自己做操作?
我知道这意味着 glibc 开发人员将有更多的工作,他们必须对 Linux 有深入的了解,但 glibc 不是已经与 Linux 内核密切相关吗?
另外,我知道系统调用函数是在 CPU 的 ring 0 中运行的……但这样做的真正意义是什么?如果我执行一个程序,我就授予它运行的明确权限,那么通过分离哪些代码可以在不同的上下文中运行来增加什么安全性,因为无论如何你都授予它所有权限?
【问题讨论】:
-
为什么用户空间程序不能自己做事情 - 它可以。在 DOS 中。然后人们意识到,为了更大的利益,他们需要保护某些东西不被任何人访问。
-
因为操作系统(即 linux 内核)必须管理硬件资源并协调其他用户程序也发出请求 - 所以它必须具有该权限。如果个别程序只是做他们喜欢做的事,你就会回到 DOS 的黑暗时代
-
回想一下,主要工作之一是为系统提供安全性和稳定性。如果任何旧的用户空间程序能够为所欲为,它就无法做到这一点。因此,用户空间到内核的接口是存在的,所以内核可以确定程序只能做它允许做的事情。
-
"为什么 Glibc 不做实际操作,而只是作为系统调用的包装器?"你为什么不把这个推得更远一点?为什么程序员不自己做操作而不是使用?
-
阅读Operating Systems: Three Easy Pieces,因为回答您的问题需要整本书
标签: c linux-kernel system system-calls glibc