前言
本文为 《图解系统》系列文章的个人学习笔记,对具体知识点与示例进行了归纳整理,详细内容参考小林coding 。
一、内核
内核基本功能
计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等。如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以需要一个「中间人」来屏蔽硬件设备的处理细节,并为应用层程序提供服务。这个「中间人」就是内核。
内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节。
现代操作系统中,内核具有 4 个基本能力:
(1)管理进程/线程:决定哪个进程、线程使用 CPU,也就是进程调度的能力。
(2)管理内存:决定内存的分配和回收,也就是内存管理的能力。
(3)管理硬件设备:为进程与硬件设备之间提供通信能力,也就是硬件通信能力。
(4)提供系统调用:如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。
内核工作方式
内核具有很高的权限,可以控制 cpu、内存、硬盘等硬件,而应用程序具有的权限很小。因此大多数操作系统,把内存分成了两个区域:
内核空间:只有内核程序可以访问;
用户空间:专门给应用程序使用;
因此,用户空间的代码只能访问一个局部的内存空间,而内核空间的代码可以访问所有内存空间。当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。
内核程序执行在内核态,用户程序执行在用户态。应用程序如果需要进入内核空间,就需要通过系统调用,下面来看看系统调用的过程:
当应用程序使用「系统调用」时,会产生一个中断。发生中断后, CPU 会中断当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续工作。
内核架构
对于内核的架构一般有这三种类型:
宏内核,包含多个模块,整个内核像一个完整的程序,包含了进程调度、内存管理、文件系统、设备驱动等模块,都运行在内核态。
微内核,有一个最小版本的内核,内核只保留最基本的能力,一些模块和服务则由用户态管理。
混合内核:是宏内核和微内核的结合体,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序。
Linux 的内核设计是采用了宏内核,Window 的内核设计则是采用了混合内核。
这两个操作系统的可执行文件格式也不一样,Linux 可执行文件格式叫作 ELF,Windows 可执行文件格式叫作 PE。