什么是内核?操作系统内核到底管哪些事
什么是内核?操作系统内核到底管哪些事
这是“操作系统系列教程”的第二篇。在上一篇文章中,我们知道了操作系统是硬件与应用软件之间的桥梁。那么,这座桥梁最核心的承重结构是什么?答案就是——内核。
从一个日常场景说起
你有没有遇到过这种情况:
电脑突然蓝屏,屏幕上跳出一行看不懂的错误码;或者 Linux 服务器上的某个进程怎么都杀不掉,提示“Operation not permitted”;又或者手机卡死之后自动重启,开机后一切恢复正常。
这些现象背后,往往都和同一个东西有关——内核。
很多初学者会有一个误解:以为操作系统就是内核,内核就是操作系统。这两个概念确实关系密切,但并不能画等号。上一篇文章我们说过,完整的操作系统包括内核、系统库、Shell、桌面环境等。而内核,只是其中最核心、最底层、权限最高的那一部分。
打个比方:如果把操作系统比作一家公司,那么内核就是公司的总经理办公室——它不直接面对客户(用户),也不负责具体业务(应用程序),但它掌握着所有资源的调配权,决定着谁能用会议室、谁能报销、谁可以进出哪些区域。
这篇文章,我们就来把“内核”这件事讲清楚。
一、内核到底是什么?
1.1 内核的定义
先给出一个正式的定义:
内核(Kernel)是操作系统的核心部分,是运行在最高特权级上的系统软件,负责管理计算机的硬件资源,并为上层应用程序提供受控的访问接口。
这个定义里有三个关键词:
- 核心部分:内核不是操作系统的全部,但它是操作系统中最关键的部分。没有内核,操作系统就无法运转。
- 最高特权级:内核运行在 CPU 的最高特权级(通常称为内核态或 Ring 0),可以执行所有指令、访问所有硬件。
- 受控访问:应用程序不能直接操作硬件,必须通过内核提供的接口(系统调用)来请求服务。
1.2 内核在系统中的位置
图 1:内核在计算机系统中的位置。 内核向下管理硬件,向上通过系统调用接口为应用程序提供服务。
从图 1 可以看出,内核是硬件和软件之间的“中间层”。它把复杂的硬件细节隐藏起来,向上提供统一的接口。应用程序不需要知道硬盘是机械硬盘还是固态硬盘,不需要知道网卡是什么型号,只需要调用内核提供的接口即可。
1.3 一个直观的类比
我们可以用“餐厅”来类比整个计算机系统:
| 计算机系统 | 餐厅类比 | 说明 |
|---|---|---|
| 硬件 | 厨房设备、食材 | 真正干活的部分,但用户不能直接进去 |
| 内核 | 厨师长 | 掌管厨房所有资源,决定谁用什么设备、按什么顺序做菜 |
| 系统调用 | 点菜窗口 | 顾客通过这个窗口向厨师长下单 |
| 应用程序 | 顾客 | 提出需求,但不直接进厨房 |
| 用户 | 食客 | 最终享受服务的人 |
顾客不能直接冲进厨房炒菜,就像应用程序不能直接操作硬件一样。厨师长(内核)负责协调所有资源,保证厨房有序运转。
二、为什么需要内核?
你可能会问:为什么不能让应用程序直接操作硬件?为什么要多一层内核?
答案可以归结为三个词:管理、保护、抽象。
2.1 管理:让资源有序分配
计算机中的资源是有限的。CPU 只有一个或几个核心,内存容量有限,硬盘只有一个,网卡只有一个。如果多个程序同时想用这些资源,没有统一的管理者,就会乱套。
内核就像一个交通警察,负责决定:
- 哪个进程现在可以使用 CPU?
- 内存如何分配给不同的进程?
- 多个程序同时要写文件,先给谁写?
- 网卡收到数据包,应该交给哪个程序?

图 2:内核作为资源管理者。 多个程序竞争有限资源,内核负责统一分配和调度。
2.2 保护:防止程序互相破坏
如果没有内核,一个程序可以随意读写另一个程序的内存,甚至可以直接操作硬件。这意味着:
- 你写的一个小 bug,可能导致整个系统崩溃;
- 一个恶意程序可以窃取另一个程序的数据;
- 一个程序可以格式化整个硬盘。
内核通过特权级机制和地址空间隔离来防止这些问题。应用程序运行在用户态,权限受限;内核运行在内核态,拥有最高权限。应用程序想访问硬件或内核数据,必须通过系统调用“请求”内核代为执行。

图 3:内核的保护机制。 程序之间互相隔离,只能通过内核访问共享资源。
2.3 抽象:让编程更简单
直接操作硬件是非常痛苦的。程序员如果必须自己控制磁盘马达、处理网卡中断、管理内存地址,那么开发一个简单程序都会变得极其复杂。
内核提供了大量抽象:
- 进程:把“一个正在运行的程序”抽象出来;
- 文件:把磁盘上的数据抽象成有名字、可读写的对象;
- 虚拟内存:让每个程序都以为自己拥有连续、独立的内存空间;
- 套接字:把复杂的网络协议抽象成简单的发送和接收接口。
有了这些抽象,程序员写代码时只需要调用 open()、read()、write() 这样的接口,而不需要关心底层硬件是怎么工作的。
三、内核的核心职责
内核到底管哪些事?不同教材的分类略有差异,但核心职责可以归纳为以下五大类。
图 4:内核的五大核心职责。 本系列后续文章将逐一深入讲解每个模块。
3.1 进程管理
进程是程序的一次执行过程。内核负责:
- 创建和销毁进程:当你双击一个图标,内核会创建一个新进程;当程序退出,内核负责回收资源。
- 进程调度:决定哪个进程现在可以使用 CPU,使用多久。Linux 中常用的调度器有 CFS(完全公平调度器)等。
- 进程间通信:提供管道、消息队列、共享内存等机制,让不同进程可以交换数据。
- 进程同步:提供信号量、互斥锁等机制,防止多个进程同时访问共享资源导致错误。

图 5:进程的基本状态转换。 内核负责管理进程在就绪、运行、阻塞等状态之间的切换。
3.2 内存管理
内存是计算机中最宝贵的资源之一。内核负责:
- 内存分配与回收:当程序需要内存时,内核负责分配;当程序释放内存时,内核负责回收。
- 虚拟内存:让每个进程都以为自己拥有独立、连续的内存空间,实际上物理内存可能是不连续的,甚至部分数据暂时存放在硬盘上。
- 地址映射:把程序使用的虚拟地址转换为物理地址。
- 内存保护:防止一个进程访问另一个进程的内存。

图 6:虚拟内存与地址映射。 内核通过内存管理单元(MMU)把不同进程的虚拟地址映射到物理内存。
3.3 文件系统管理
文件系统是内核中负责管理磁盘数据的部分。内核负责:
- 文件的创建、读写、删除:提供
open()、read()、write()、close()等系统调用。 - 目录管理:组织文件的层次结构,支持路径解析。
- 权限控制:决定哪个用户可以对哪个文件执行什么操作。
- 磁盘空间管理:跟踪哪些磁盘块被使用,哪些空闲。
在 Linux 中,有一句经典的话:“一切皆文件”。不仅普通文件和目录是文件,就连设备、管道、套接字也都被抽象成文件。这大大简化了编程接口。
3.4 设备管理
计算机连接着各种外设:键盘、鼠标、显示器、硬盘、网卡、打印机等。内核负责:
- 设备驱动:每种设备都有对应的驱动程序,内核通过驱动与硬件通信。
- 中断处理:当设备完成操作或发生事件时,会发出中断信号,内核负责响应。
- 缓冲管理:在设备和内存之间设置缓冲区,平衡速度差异。
- 设备分配:多个程序同时请求同一设备时,内核决定先后顺序。
图 7:设备读取的简化流程。 应用程序通过内核和驱动间接访问硬件,硬件通过中断通知内核。
3.5 网络管理
现代操作系统都内置了网络协议栈。内核负责:
- 协议栈实现:如 TCP/IP 协议栈,处理数据包的封装、解析、转发。
- 数据包收发:从网卡接收数据包,交给对应的应用程序;把应用程序的数据包发送到网卡。
- 网络接口管理:管理 IP 地址、路由表、防火墙规则等。
你在 Linux 中使用 ping、curl、ssh 等命令时,背后都有内核网络协议栈在默默工作。
四、内核的分类
内核并不是只有一种设计方式。根据内核功能的组织方式,可以分为三大类:宏内核、微内核和混合内核。
图 8:内核的三种主要分类。
4.1 宏内核
宏内核(Monolithic Kernel)把进程管理、内存管理、文件系统、设备驱动、网络协议栈等所有核心功能都放在内核态中运行。
代表:Linux、传统的 Unix。
优点:
- 性能高:所有功能都在内核态,函数调用不需要频繁切换特权级。
- 实现直接:模块之间可以直接调用。
缺点:
- 内核体积大:所有代码都在内核态运行,一处出错可能导致整个系统崩溃。
- 扩展性差:添加新功能需要重新编译内核或加载内核模块。
Linux 虽然是宏内核,但支持内核模块机制,可以在运行时动态加载和卸载驱动,兼顾了一定的灵活性。
4.2 微内核
微内核(Microkernel)只把最核心的功能放在内核态,如进程调度、内存管理、进程间通信。文件系统、设备驱动、网络协议栈等都在用户态运行。
代表:QNX、L4、Mach。
优点:
- 可靠性高:某个服务崩溃不会导致整个系统崩溃。
- 安全性好:内核攻击面小。
- 易于扩展:添加新服务不需要修改内核。
缺点:
- 性能开销大:用户态和内核态之间频繁切换,进程间通信成本高。
- 实现复杂:需要精心设计进程间通信机制。
4.3 混合内核
混合内核(Hybrid Kernel)是宏内核和微内核的折中方案。它把一些非核心功能放在用户态,但为了性能,又把一些关键功能放回内核态。
代表:Windows NT、macOS(XNU)。
图 9:宏内核与微内核的对比。 宏内核把所有功能放在内核态,微内核只保留最核心的功能。
五、主流操作系统的内核
5.1 Linux 内核
Linux 内核是世界上最著名的开源内核,由 Linus Torvalds 于 1991 年发布。它采用宏内核设计,但支持动态加载内核模块。
Linux 内核的主要特点:
- 开源:任何人都可以查看、修改、分发源代码。
- 可移植:支持多种 CPU 架构,包括 x86、ARM、RISC-V、龙芯等。
- 模块化:驱动和部分功能可以编译成模块,运行时动态加载。
- 社区驱动:全球数千名开发者共同维护。
你在终端中输入的 uname -r 命令,查看的就是当前 Linux 内核的版本号。
5.2 Windows 内核
Windows NT 内核采用混合内核设计,核心功能包括进程管理、内存管理、对象管理、安全引用监视器等。Windows 的图形子系统(Win32k)早期运行在内核态,后来部分功能逐步移到用户态。
5.3 国产操作系统内核
国产操作系统大多基于 Linux 内核。例如:
- 银河麒麟、统信 UOS、深度 deepin:基于 Linux 内核,针对国内软硬件生态进行适配。
- openEuler:华为开源的操作系统,基于 Linux 内核,面向服务器和云计算场景。
- 鸿蒙 HarmonyOS:华为开发的分布式操作系统,其内核为鸿蒙微内核(HarmonyOS Microkernel),采用微内核设计,强调分布式能力和安全性。
图 10:国产操作系统与内核的关系。 大多数国产操作系统基于 Linux 内核,鸿蒙采用自主微内核设计。
六、内核如何与用户程序交互:系统调用
应用程序不能直接调用内核函数,必须通过系统调用(System Call)进入内核态。系统调用是用户程序与内核之间的唯一合法入口。
图 11:系统调用的完整流程。 应用程序通过系统库发起系统调用,内核执行特权操作后返回结果。
常见的系统调用包括:
| 类别 | 系统调用示例 | 作用 |
|---|---|---|
| 进程管理 | fork()、exec()、exit() | 创建、执行、终止进程 |
| 文件操作 | open()、read()、write()、close() | 打开、读写、关闭文件 |
| 内存管理 | brk()、mmap() | 分配、映射内存 |
| 网络通信 | socket()、bind()、send()、recv() | 创建套接字、收发数据 |
| 设备操作 | ioctl() | 控制设备 |
在 Linux 中,系统调用通常通过 syscall 指令或 int 0x80 指令触发。内核中维护着一张系统调用表,根据系统调用号找到对应的处理函数。
七、常见误区澄清
| 误区 | 真相 |
|---|---|
| “内核就是操作系统” | 内核是操作系统的核心,但操作系统还包括系统库、Shell、桌面环境等 |
| “内核是硬件” | 内核是软件,是运行在最高特权级的系统软件 |
| “所有操作系统的内核都一样” | Linux 是宏内核,QNX 是微内核,Windows NT 是混合内核,设计差异很大 |
| “应用程序可以直接访问硬件” | 不能。应用程序必须通过系统调用请求内核代为访问 |
| “内核越大越好” | 不一定。宏内核性能高但可靠性风险大,微内核可靠性高但性能开销大,各有取舍 |
| “鸿蒙内核就是 Linux” | 鸿蒙采用自主微内核设计,不是 Linux 内核 |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)