seegongsik
我的单词本
操作系统

系统调用:程序向操作系统请求的正式窗口

上一讲结尾,我们瞥见了一道奇妙的缝隙。操作系统给每个文件定了权限,可偏偏我的程序,连一个被允许读取的文件,都没法直接从磁盘里取出来。其实程序连磁盘、屏幕、网络都不能随意触碰。它被关在一道牢固的围栏里。那么,它到底是怎么打开文件、把字显示到屏幕上的呢?

01

程序被关在围栏里(用户态)

前面说过,操作系统立起一道墙,让程序之间不能侵犯彼此的内存。那道墙,对硬件也一样起作用。普通程序不能直接伸手去碰磁盘,不能直接在屏幕上点一个点,也不能直接碰网络线。就好像它待在一道围栏里。这种被关住的状态,叫作用户态。看着憋屈,可是有道理的。要是随便哪个程序都能直接摆弄硬件,那么一个满是错误、或者心怀恶意的程序,就可能毁掉整台电脑。

程序
磁盘

让程序直接伸手去碰磁盘。它会被墙挡住、阻止(红色)。用户态的程序不能直接触碰硬件。

每次直接伸手,都一一被挡。为了安全,这是理所当然的。可这样就奇怪了。我们每天用的程序,明明好好地打开文件、显示照片、连上网络。说是被关着,那这些活儿到底是怎么干成的呢?秘密在于:不是自己干,而是去请求。下面,我们就看看这"请求"是怎么做的。

02

办法:到正式窗口去请求(系统调用)

去银行的时候,我们不会自己走进金库。我们到窗口,递上一张申请单,握着钥匙的职员替我们办好。程序也一样。它打不开磁盘,于是到操作系统的窗口去请求。"帮我打开这个文件""把这些字显示到屏幕上""用网络把这个发出去"。这样递给操作系统的每一个请求,就叫作系统调用。关键在于:程序不自己干活,而是让操作系统去干。因为操作系统才有那个权限。

程序
操作系统窗口
磁盘

点申请单,到窗口去请求。程序(金色)把打开文件递到操作系统窗口(蓝色),操作系统替它办好,把结果还回来(绿色)。

到窗口一请求,办不成的事就办成了。程序依然在围栏里,却通过操作系统这个代理人,把外面的活干成了。可有一样很微妙。明明是同一块磁盘,为什么程序直接碰就被挡,操作系统去碰就行呢?在越过窗口的那一瞬间,肯定有什么发生了变化。下面,我们就细看这个变化。

03

越过窗口,权限就切换(用户态与内核态)

秘密在于:CPU 有两种模式。一种是用户态,是我们的程序居住的、力量受限的世界。另一种是内核态,是操作系统那个能碰硬件、能碰一切的强大世界。平时程序在用户态里跑。而当系统调用越过窗口的那一瞬间,CPU 就短暂地切换到内核态。凭着那股强权限,操作系统把被请求的活处理好,干完就立刻切回用户态,把结果交给程序。强大的力量,只在处理请求的那一刻、而且只在这个窗口被授予,随即又被收回。

用户态

点发起系统调用。程序在用户态(金色)里跑,一越过窗口就切到内核态(蓝色)把活处理好,再切回用户态。

模式短暂地切换、又切回。这支小小的舞,其实正是操作系统安全的核心。力量并非一直开着,而是请求一到的那一刻才开一下,随即又关上。可这里又生出一个疑问。要是只要越过窗口,操作系统就照吩咐什么都办,那到头来,和程序直接碰硬件又有什么区别呢?所以窗口还多了一件事:检查。下面就来看。

04

窗口只有一个,才能检查(权限确认)

要是操作系统一被请求,就不问不查全办了,那窗口就只是个过路点罢了。可操作系统不这么干。因为所有请求都必须经过这一个窗口,操作系统就能在处理之前,先检查。"你有读这个文件的权限吗?"上一讲看到的那个权限确认,正是在这里发生。有权限就办,没权限就拒绝、返回一个错误。一个窄窄的窗口,成了所有危险动作都必经的关卡。

选一个请求,送到窗口。操作系统检查权限。被允许的请求会被办好(绿色);被禁止的(比如写别人的文件)会被拒绝(红色),并返回一个错误。

被允许的请求通过了,被禁止的请求在门口被拦住了。窗口窄,不是不方便,反倒是一道安全装置。既然所有危险动作都必经一处,那只要在那一处守住规则就行。好,现在我们把用户态的围栏、叫作系统调用的请求、短暂切换的内核态,以及窗口处的检查,串成一条线吧。

05

小结:串成一条线的往返,以及窗口背后的内核

把整体看成一条线,是这样的。程序在用户态的围栏里跑,碰不到硬件。一旦需要什么,就用系统调用到正式窗口去请求。一越过窗口,CPU 就短暂切到内核态,操作系统先检查权限,再处理这件活。干完,就切回用户态,把结果交回来。所以,系统调用就是连接程序与操作系统之力的、唯一一道被严密守护的门。我们每次打开文件、在屏幕上点一个点、往网上发点什么,所有这些,都悄悄地经过这道门。

依次点各个步骤,跟着走完一整圈。从用户程序到系统调用,到内核态切换与权限检查,到处理活儿、再到把结果还回。一整趟往返,一张就理清。

可在那窗口背后,用内核态的强大之力,实际把活处理好的,究竟是谁呢?操作系统最深的中心,那个握着一切权限、直接与硬件对话的核心,有一个名字。就是内核。说到底,系统调用,正是送给这个内核的请求。下一讲,我们终于要正面见一见这个内核。一路看下来的调度、内存、文件、权限、窗口,到底都是在谁的手里转动的,我们会在一处看个明白。

一句话总结每个程序都被关在围栏里(用户态),不能直接触碰硬件。要干活,就得向操作系统请求。这个请求,正是系统调用。它把"打开这个文件""显示到屏幕上"之类的要求,递到一个正式窗口。一越过窗口,CPU 就短暂地切换到强大的权限(内核态),操作系统把活干完,随即切回原来的模式。因为窗口只有一个,操作系统能先检查每一个请求(权限检查也在这里),正因如此,围栏稳稳地立着,而程序仍能完成它需要的活。
操作系统
如果有帮助,请支持我们