什么是操作系统内核
上一课说过,程序到正式窗口(系统调用)去请求,请求越过窗口的那一刻,CPU 会短暂切换到内核态。那么,在窗口背后凭着强大权限真正干活的,到底是谁?这个模式又为什么偏偏叫“内核”态?这一课,我们就正面认识操作系统最深处的中心,那个始终守在岗位上的核心。
窗口背后是谁
回想一下上一课。程序被关在围栏里,碰不到硬件,需要办事时,就到叫作系统调用的正式窗口去请求。请求越过窗口的那一刻,CPU 短暂切换到内核态,把事办完再回来。
当时,我们故意没去看一样东西:在窗口背后,凭着那份强大权限真正干活的那个存在。
窗口只是接收请求的入口,再往里,另有一个真正去读磁盘、在屏幕上点亮像素的干活者。它的名字就是内核。
点按钮,系统调用窗口背后那个被遮住的格子就会打开,露出内核。真正处理程序请求的,一直就是这个内核。
现在,内核态这个名字也说得通了:那份强大权限,就是内核干活时用的力量,所以模式以它命名。
那么,内核是不是只在请求到来时露一下面,随即消失?并不是。
狭义上说“操作系统”时,指的往往就是这个内核。
内核从什么时候起、到什么时候止守在那里,是接下来要讲的。
内核始终醒着
我们用的应用总是开了又关。打开音乐应用又关掉,启动浏览器又退出。应用需要时被载入内存,关掉后就从内存中移走。
内核却不一样。电脑开机、启动的过程中,它就被载入内存、站稳位置,直到断电,一次也不离开。不管应用怎样进进出出,内核始终在它们下面醒着。
仔细想想也理所当然:把应用载入内存又移走、决定 CPU 交给谁,这些活都是内核在干。内核要是睡着了,就没有谁能来做这些事了。
上面三个应用格,每点一下就开或关,最下面的内核格却一直亮着。从开机到关机,内核一直常驻内存。
应用格忽明忽暗,内核格却始终亮着。内核有点像在后台拉幕、落幕的人:演员上场下场,这个人却整场都守在原位。
那么,内核守在那里,具体在做什么?其实,这一单元学过的几乎所有事,都在内核手里运转。
所有资源的塔台
一路学下来,我们认识了不少东西:决定先把 CPU 交给谁的调度、让内存看起来比实际更大的虚拟内存、让系统能和新设备沟通的驱动、整理文件的文件系统,还有判断谁能做什么的权限确认。
当时是一样一样分开学的,可真正把这些活干成的,只有一双手,那就是内核。
内核就像机场的塔台。塔台在一处决定每架飞机何时起降、用哪条跑道;内核也在一处决定 CPU、内存、设备、文件这些资源,给谁、给多少。
五种资源随便点一个,中间的内核格就会亮起来。不管是 CPU 调度,还是内存、驱动、文件、权限,管这件事的都是内核。
不论点哪种资源,路都汇到了内核。看似零散的活,其实都围着同一个中心转。
可内核把这么多强大的活都包了,会不会很危险?要是随便哪个程序都能用这股力量,那就糟了。
所以,计算机把力量的世界一分为二。
两种模式的边界
再回想一下上一课的两种模式。用户态是我们的应用所在、能力受限的世界;内核态则是内核干活的世界,在那里硬件和其他一切都能直接碰。
两者之间有清楚的边界。用户态的应用不能直接伸手碰硬件,只有在内核态里工作的内核才能直接碰。所以应用想自己动手就会被挡住,只有请内核帮忙、经过内核态,事情才办得成。
有了这道边界,强大的力量就只集中在值得信任的内核这一处。
用左边的按钮切换模式,用右边的按钮直接去碰硬件。用户态下会被阻止(红色),只有内核态才被允许(绿色)。强大的力量只存在于内核态之中。
在用户态被挡住,只有在内核态才通过。强大的力量集中在内核一处,让人放心:危险操作只经过一个地方,只要守好那里就行。
可同时也冒出一个让人心惊的念头:既然一切都系在内核身上,要是内核本身出了问题,会怎样?
内核停下来时
把看到的归拢一下:内核是在系统调用窗口背后办实事的核心程序,从开机到关机常驻内存,并用一双手统管 CPU、内存、设备、文件和权限这些资源。强大的内核态,就是它干活时用的力量。
所以,即使某个应用出错卡死或崩溃,只要它下面的内核还活着,就只清理掉那一个应用,其余照常运行。我们能强制关掉一个卡住的应用、继续用电脑,靠的就是这一点。
可要是内核本身停了,情况就完全不同。负责清理应用、分配资源、处理请求的那双手没了,它上面的所有应用和整个系统会一下子全部停住。屏幕突然变蓝,或者怎么点都没反应、只能重启的那种少见时刻,正是内核再也撑不住的时候。Windows 的蓝屏、Linux 的内核恐慌(kernel panic),说的就是这种情况。
三个应用点任意一个,就只有它停下,其余照常。最后点下面的“停掉内核”按钮,它上面的一切会一下子全部停止(红色)。
现在,操作系统的正中心已经清清楚楚。分开学过的调度、内存、驱动、文件、权限和系统调用,全都在这一个内核手里运转。
可资源由一双手来分配,也会冒出新的麻烦:两个程序各自攥着手里的东西不放,只等着对方手里的,结果两个都永远停住。
下一课,我们就来讲这种谁也不让谁时发生的死锁。