我一直在阅读系统调用及其在Linux中的工作方式.我仍然有更多的阅读要做,但有一件事,我已经读过的没有回答的是,为什么我们需要系统调用?
我知道系统调用是来自用户空间程序的请求,内核要做一些事情,但我的问题基本上是:为什么用户空间程序不能自己做呢?为什么Glibc不执行实际操作而不仅仅是作为系统调用的包装器?
例如,如果我调用fopen()
我的程序,为什么glibc会调用open
系统调用?为什么glibc本身不进行操作?
我明白这意味着glibc开发人员会有更多的工作,他们必须对Linux有一个深入的了解,但是glibc与Linux内核的关系是否已经非常密切了?
另外,我知道系统调用函数在CPU的0环上运行......但是真正重点是什么呢?如果我执行一个程序,我给它明确的运行权限,那么通过分离哪些代码可以在不同的上下文中运行来添加什么安全性,因为你还是给了它所有权限?
为什么glibc本身不进行操作?
好吧,这就是旧的MS/DOS系统的方式:内核代码和用户代码之间没有分离,用户代码可以愉快地直接访问硬件.
这只有两个主要问题:
它对单个用户而不是多任务系统工作(相当)很好,但只要多个程序可以在系统中同时运行,就必须同步硬件访问和内存使用=>这些是专用于内核的部分
对于编码不良的程序,系统没有任何保护.在现代操作系统中,错误的程序可能会崩溃,但系统本身应该存在.在MS/DOS中,程序崩溃通常在系统重启时结束.
出于这些原因,所有现代操作系统(除了一些轻量级嵌入式操作系统)都使用不同用户进程和内核之间的隔离.而这只是意味着你需要一种方法来允许用户模式进程需要特权操作(读取或写入物理磁盘是从内核):这正是系统调用的制作.