内核
3.1 Linux 内核 vs Windows 内核
Windows 和 Linux 可以说是我们比较常见的两款操作系统的。
Windows 基本占领了电脑时代的市场,商业上 取得了很大成就,但是它并不开源,所以要想接触
源码得加入 Windows 的开发团队中。
对于服务器使用的操作系统基本上都是 Linux ,而且内核源码也是开源的,任何 人都可以下载,并
增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。
这两个 操作系统各有千秋,不分伯仲 。
操作系统核心的东西就是内核,这次我们就来看看 ,Linux 内核和 Windows 内核有什么 区别?
内核
什么 是内核呢?
计算机是由各种外部硬件设备组成的,比如内存、cpu 、硬盘等,如果每个应用都要和这些硬件设
备对接通信协议,那这样太累了,所以这个中 间人就由内核来负责 ,让内核作为应用连接硬件设
备的桥梁 ,应用程序只需关心与内核交互 ,不用关心硬件的细节。

内核有哪些能力呢?
现代操作系统,内核一般会提供 4 个基本能力:
管理进程、线程,决定哪个进程、线程使用 CPU ,也就是进程调度的能力;
管理内存,决定内存的分配和回收,也就是内存管理的能力;
管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户
程序与操作系统之间的接口。
内核是怎么工作的?
内核具有很高的权限,可以控制 cpu 、内存、硬盘等硬件,而应用程序具有的权限很小,因此大多
数操作系统,把内存分成了两个 区域:
内核空间,这个内存空间只有内核程序可以访问;
用户空间,这个内存空间专⻔给应用程序使用;
用户空间的代码只能访问一个局部的内存空间,而内核空间的代码可以访问所有内存空间。因
此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在
内核态执行。
应用程序如果需要进入内核空间,就需要通过系统调用,下面来看看 系统调用的过程:

内核程序执行在内核态,用户程序执行在用户态。当应用程序使用系统调用时,会产生一个中
断。发生中断后, CPU 会中断当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执
行内核程序。内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续
工作。
Linux 的设计
Linux 的开山始祖是来自一位名叫 Linus Torvalds 的芬兰小伙子,他在 1991 年用 C 语言写出了第
一版的 Linux 操作系统,那年他 22 岁。
完成第一版 Linux 后,Linus Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费
下载和使用。
Linux 内核设计 的理念主要有这几个点:
MultiTask ,多任务
SMP ,对称多处 理
ELF ,可执行文件链接格式
Monolithic Kernel ,宏内核
MultiTask
MultiTask 的意思是多任务,代表着 Linux 是一个多任务的操作系统。
多任务意味着可以有多个任务同时执行,这里的「同时」可以是并发或并行:
对于单核 CPU 时,可以让每个任务执行一小段时间,时间到就切换另外一个任务,从宏观⻆度
看,一段时间内执行了多个任务,这被称为并发。
对于多核 CPU 时,多个任务可以同时被不同核心的 CPU 同时执行,这被称为并行。
SMP
SMP 的意思是对称多处 理,代表着每个 CPU 的地位是相等的,对资源的使用权限也是相同的,多
个 CPU 共享同一个内存,每个 CPU 都可以访问完整的内存和硬件资源。
这个特点决定了 Linux 操作系统不会有某 个 CPU 单独服务应用程序或内核程序,而是每个程序都
可以被分配到任意一个 CPU 上被执行。
ELF
ELF 的意思是可执行文件链接格式,它是 Linux 操作系统中可执行文件的存储格式,你可以从下 图
看到它的结构:

ELF 把文件分成了一个个 分段,每一个段都有自己的作用,具体每个段的作用这里我就不详细说明
了,感兴趣的同学可以去看《程序员的自我修养—— 链接、装载和库》这本书。
另外,ELF 文件有两种索引,Program header table 中记录了「运行时」所需的段,而 Section header table 记录了二进制文件中各个「段的首地址 」。
那 ELF 文件怎么生成的呢?
我们编写的代码,首先通过「编译器」编译成汇编代码,接着通过「汇编器」变成目标代码,也
就是目标文件,最后通过「链接器」把多个目标文件以 及调用的各种函数库链接起来,形成一个
可执行文件,也就是 ELF 文件。
那 ELF 文件是怎么被执行的呢?
执行 ELF 文件的时候,会通过「装载器」把 ELF 文件装载到内存里,CPU 读取内存中的指令和数
据,于是程序就被执行起来了。
Monolithic Kernel
Monolithic Kernel 的意思是宏内核,Linux 内核架构 就是宏内核,意味着 Linux 的内核是一个完整
的可执行程序,且拥有最 高的权限。
宏内核的特征是系统内核的所有模块,比如进程调度、内存管理、文件系统、设备驱动等,都运
行在内核态。
不过,Linux 也实现了动态加载内核模块的功能,例如大部分设备驱动是以可加载模块的形式 存在
的,与内核其他模块解藕,让驱动开发和驱动加 载更为方便、灵活。

与宏内核相反的是微内核,微内核架构 的内核只保留最基本的能力,比如进程调度、虚拟机内
存、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等。这样服务与服务之间是
隔离的,单个服务出 现故障或者完全攻击,也不 会导致整个操作系统挂掉 ,提高了操作系统的稳
定性和可 靠性。
微内核内核功能少,可移植性高,相比宏内核有一点不好的地方在于,由于驱动程序不在内核
中,而且驱动程序一般会频繁调用底层能力的,于是驱动和硬件设备交互 就需要频繁切换到内核
态,这样会带来性能损耗。华为的鸿蒙操作系统的内核架构 就是微内核。
还有一种内核叫混合类型内核,它的架构有 点像微内核,内核里面会有一个最小版本的内核,然
后其他模块会在这个基础上搭建,然后实现的时候会跟宏内核类似,也就是把整个内核做成一个
完整的程序,大部分服务都在内核中,这就像是宏内核的方式包裹着一个微内核。
Windows 设计
当今 Windows 7 、Windows 10 使用的内核叫 Windows NT ,NT 全称叫 New Technology 。
下图是 Windows NT 的结构图片:

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

总结
对于内核的架构 一般有这三种类型:
宏内核,包含多个模块,整个内核像一个完整的程序;
微内核,有一个最小版本的内核,一些模块和服务则 由用户态管理;
混合内核,是宏内核和微内核的结合体,内核中抽象出了微内核的概念,也就是内核中会有一
个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序;
4.1 为什么 要有虚拟内存? →
Powered by GitHub & Vssue
Linux 的内核设计 是采用了宏内核,Window 的内核设计 则是采用了混合内核。
这两个 操作系统的可执行文件格式也不 一样, Linux 可执行文件格式叫作 ELF ,Windows 可执行文
件格式叫作 PE 。
