1. 内核

计算机是由各种外部硬件设备组成的,如果每个应用都要和 这些硬件设备 对接通信协议,那编写应用程序的工作 将会非常繁杂。因此,内核以中间人的身份 作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,而无需关心硬件的细节

现代操作系统中,内核⼀般会提供 4个基本能力:
  • 管理进程、线程,决定哪个进程、线程使用CPU,也就是进程调度的能⼒。
  • 管理内存,决定内存的分配和回收,也就是内存管理的能⼒。
  • 管理硬件设备,为进程与硬件设备之间提供通信能⼒,也就是硬件通信能⼒。
  • 提供系统调用,如果应用程序 需要运行更高权限任务的服务,那么就需要系统调用,系统调用是 用户程序与操作系统之间的接口

问题:内核是怎么工作的?
内核有很高的权限,可以控制 cpu、内存、硬盘等硬件;而应用程序的权限很小。因此,大多数操作系统 将内存分为两个区域:
  • 内核空间:这个内存空间 只有内核程序可以访问
  • 用户空间:这个内存空间 专门给应用程序使用
用户空间的代码只能访问一个 局部的内存空间;内核空间的代码可以访问 所有的内存空间。因此,当程序使用 用户空间时,程序在用户态执行;当程序使用 内核空间时,程序在内核态执行。
应用程序进入内核空间 需要通过系统调用。过程如下图:

内核程序执行在 内核态,用户程序执行在 用户态。过程:
  1. 当应用程序执行 系统调用时,会产生⼀个中断;
  2. 发生中断后, CPU会中断 当前正在执行的用户程序,转而跳转到 中断处理程序,也就是开始执行 内核程序;
  3. 内核程序执行完后,主动触发中断,将CPU执行权限 交还给用户程序,从而回到用户态 继续工作。

2. Linux 的设计

Linux内核设计的理念 主要有以下几点:
  • MutiTask,多任务
  • SMP,对称多处理
  • ELF,可执行文件链接格式
  • Monolithic Kernel,宏内核

(1) MutiTask:
MutiTask 的意思是多任务,代表着 Linux是⼀个多任务的操作系统。
多任务意味着 可以有多个任务同时执行,这里的"同时"可以是 并发或并
  • 单核CPU:可以让每个任务 执行一小段时间 (时间片),时间到 就切换到另⼀个任务执行。从宏观角度看,⼀段时间内执行了多个任务,这被称为并发
  • 多核CPU:多个任务可以同时被 不同核心的CPU 同时执行,这被称为并行

(2) SMP:
SMP 的意思是对称多处理,代表着 每个CPU的地位是相等的,对资源的使用权限 也是相同的,多个CPU共享同⼀个内存,每个CPU都可以 访问完整的内存和硬件资源。
这个特点决定了 Linux操作系统不会有 某个CPU单独服务应用程序或内核程序,而是每个程序都可以被分配到 任意一个CPU上被执行

(3) ELF:
ELF 的意思是可执行文件链接格式,它是Linux操作系统中 可执行文件的存储格式。ELF的结构如下图:

ELF 将文件分成⼀个个分段,每⼀个段都有自己的作用。具体每个段的作用 可以去看《程序员的自我修养——链接、装载和库》这本书。
ELF文件有两种索引:
  • Program header table 中记录了 运行时所需的段
  • Section headertable 中记录了 进制文件中 各个段的首地址
问题:ELF文件 是如何生成的?
编写的代码首先通过 编译器 编译成汇编代码;接着通过 汇编器 汇编成目标代码,也就是目标⽂件;最后通过 链接器 将多个目标文件以及调用的各种函数库 链接起来,形成⼀个可执行文件,也就是ELF文件。
问题:ELF文件 是如何被执行的?
执行ELF文件时,通过 装载器 将ELF文件装载到 内存中,CPU读取 内存中的指令和数据,于是程序就被执行起来了。

(4) Monolithic Kernel:
Monolithic Kernel 的意思是宏内核,Linux内核架构 就是宏内核,意味着 Linux的内核是⼀个完整的可执行程序,且拥有最高的权限。
宏内核的特征:系统内核中的所有模块 (比如 进程调度、内存管理、文件系统、设备驱动等),都运行在内核态
但是,Linux也实现了 动态加载内核模块的功能。例如:大部分设备驱动是以 可加载模块的形式 存在的,与内核中的其它模块 解藕,使得驱动开发和驱动加载 更为方便、灵活。

与宏内核相对的是 微内核微内核架构的内核 只保留了最基本的功能 (如 进程调度、虚拟机内存、中断等),将一些应用放入到 用户空间 (如 驱动程序、文件系统等)。这样 服务与服务之间是隔离的,单个服务出现故障或者完全攻击 也不会导致整个操作系统挂掉,从而提高了 操作系统的稳定性和可靠性
  • 微内核的优点:灵活性高 易扩展、可靠性强、可移植性高。
  • 微内核的缺点:由于驱动程序 不在内核中,而且驱动程序⼀般会 频繁调用底层,于是驱动程序和硬件设备交互 就需要频繁切换到内核态,因此会带来性能损耗。(华为的鸿蒙操作系统的内核架构 就是微内核)
还有⼀种内核叫混合类型内核。它的架构 与微内核类似,内核中有⼀个 最小版本的内核,其他模块在这个内核的基础上搭建;最后的实现 与宏内核类似,即 将整个内核做成一个 完整的程序,大部分服务都在内核中,就像是 以宏内核的方式 包裹着⼀个微内核。

3. Windows 的设计

Windows 7、Windows 10 使用的内核是 Windows NT(NT全称为 New Technology)
Windows NT 的结构如下图:

Windows和Linux都同样支持 MutiTask 和 SMP,但Window的内核设计 是混合型内核。从上图中可以看到,内核中有⼀个 MicroKernel模块,这就是最小版本的内核,而整个内核实现 是⼀个完整的程序,其中包含了大量的模块。
Windows的可执行文件的格式 与Linux不同,所以这两个系统的可执行文件 无法在对方上运行。Windows的可执行文件格式 叫PE,也称为可移植执行文件,扩展名通常是 .exe 、 .dll 、 .sys 等。
PE的结构 与ELF的结构 有⼀点相似。PE的结构如下图: