c - 为什么存在系统调用
问题描述
我一直在阅读有关系统调用以及它们如何在 Linux 中工作的信息。我还有更多的阅读要做,但我没有读过的一件事是,为什么我们需要系统调用?
我知道系统调用是用户空间程序要求内核做某事的请求,但我的问题基本上是:为什么用户空间程序不能自己做这件事?为什么 Glibc 不做实际操作而只是作为系统调用的包装器?
例如,如果我fopen()
在我的程序中调用,为什么 glibc 调用open
系统调用?为什么 glibc 不自己做操作?
我知道这意味着 glibc 开发人员将有更多的工作,他们必须对 Linux 有深入的了解,但 glibc 不是已经与 Linux 内核密切相关吗?
另外,我知道系统调用函数是在 CPU 的 ring 0 中运行的……但这有什么意义呢?如果我执行一个程序,我会给予它运行的明确许可,那么通过分离哪些代码可以在不同的上下文中运行来增加什么安全性,因为无论如何你都给予了它所有的许可?
解决方案
为什么 glibc 不自己做操作?
好吧,在好的旧 MS/DOS 系统中事情的发展方式就更少了:内核代码和用户代码之间没有分离,用户代码可以愉快地直接访问硬件。
这只有两个主要问题:
- 它在单个用户而不是多任务系统上工作(相当)良好,但是一旦多个程序可以在系统中同时运行,您必须同步硬件访问和内存使用 => 这些是专用于内核的部分
- 没有保护系统免受编码不良的程序的影响。在现代操作系统中,错误的程序可能会崩溃,但系统本身应该能够存活。在 MS/DOS 中,程序崩溃通常以系统重启结束。
由于这些原因,所有现代操作系统(可能除了一些轻量级的嵌入式操作系统)都在不同的用户进程和内核之间使用隔离。这只是意味着您需要一种方法来允许用户模式进程需要来自内核的特权操作(读取或写入物理磁盘):这正是系统调用的目的。
推荐阅读
- python - 为什么元组中允许连接和重复?由于元组是不可变的,因此不应在任何时候更改
- android - 我的右侧工具栏中缺少约束 GUI。如何取回
- java - 无法读取 URL 中有空格的 ASPX 页面
- php - PHP - 以 3 个一组打印数组的值
- jquery - 在堆栈溢出中制作类似“标签部分”的文本
- gstreamer - 如何继承插件提供的元素类型?
- amazon-web-services - 在 Amazon EC2 实例上启动 Selenium GRID - 节点注册到 http://172.17.42.1:4444/grid/register/
- c++ - 无法将 argv 传递给 main 内部调用的函数
- javascript - 访问给定索引的 Map 键/值的最快方法
- ember.js - 有没有什么方法可以在没有任何插件的情况下使用 emberjs 创建登录/注册?