在安装 Linux 系统时,我们首先会面临发行版选型的问题,主要是市面上基于 Linux 的操作系统种类繁多,如 Ubuntu、银河麒麟、华为 openEuler(欧拉)等Linux操作系统。虽然这些系统由不同厂商独立研发,但都称为 Linux 系统,因为它们共用同一个 Linux 内核。各厂商只是在 Linux 内核的基础上,搭配桌面环境、常用软件、硬件驱动、系统工具等组件,封装成一套可直接安装使用的Linux 发行版,这也是我们日常实际使用的操作系统。本节课我们先大体了解Linux内核的整体架构,后续课程会逐一对内核的各个功能模块进行深度解析。一、获取Linux内核
最初的Linux内核是由芬兰赫尔辛基大学计算机科学专业学生Linus Torvalds研发的,开发初期,Linus以Intel 80386汇编语言编写了简单的任务切换器与终端驱动,实现了两个进程在屏幕上交替打印字符的基础功能,预示着Linux内核的萌芽。在1991年Linus正式发布Linux内核0.01版本,该版本仅包含10000行代码,支持x86架构、基本文件系统与进程调度,需依赖GNU工具链才能正常运行。该版本的发布,标志着Linux系统正式诞生。1992年,Linus接受Richard Stallman的建议,将Linux内核的授权协议改为GPL v2,允许开发者自由修改、分发代码,且衍生作品需遵循相同开源协议,这一决策奠定了Linux内核开源生态的发展基础。1993年,Linux内核0.99版本发布,实现了对网络协议、多任务调度的完善支持,代码量增长至10万行,同时支持更多硬件架构。同时开源社区初步形成,全球开发者通过邮件列表(LKML)提交代码补丁,Linus主导内核代码的审核与合并,形成了“核心维护者+社区贡献者”的协作模式。当前Linux内核最新正式稳定版是Linux 6.19.9,最新主线开发版是Linux 7.0,内核由全世界开发者共同维护,但由 Linus Torvalds 主导。获取 Linux 内核(源码)主要有 官方网站下载压缩包、Git 克隆仓库、发行版源码包三种方式:1、官方网站下载压缩包
mainline(主线):最新开发版,功能新、但可能不稳定;stable(稳定):修复 bug 的稳定版,适合一般使用;longterm(长期支持 ):企业 / 服务器首选,长期维护、最稳。2、Git 克隆
Linux官方提供了Git仓库,可以通过Git工具下载最新、完整的内核源代码。在克隆之前,需要先安装Git工具,我们可以通过厂商提供的包管理器来安装Git软件。不同厂商的Linux系统提供了不同的包管理器,包管理器是每个Linux发行版厂商自己提供的软件管理工具,实现软件的自动下载和安装。以Ubuntu系统包管理器为例,输入下面的命令,可自动安装Git工具:sudo apt update && sudo apt install git -y
上述命令先执行sudo apt update刷新软件列表,等命令执行成功后,然后再执行sudo apt install git -y安装Git工具。克隆Linux内核有两种方案:一种方案是完整克隆,包含Linux内核的所有历史版本,即把 Linux 内核从诞生第一天到现在的所有历史版本、所有代码、所有提交记录,全部克隆到本地计算机,适合Linux内核开发者;另外一种方案是只下载最新版本的代码,不包含历史版本。下面的命令克隆最新版本:git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
如果只想获取当前正在运行系统的Linux内核源代码,发行厂商的内核源代码和从官网下载的内核源代码有所不同,发行厂商会在官方内核基础上,添加一些设备驱动代码、修改官方没解决的一些BUG、调整系统功能和安全策略以适应发行版,这些额外修改的代码称为Linux内核补丁。输入下面的命令,可下载当前系统的Linux内核源代码。sudo apt install linux-source
图 Linxu系统架构图Linux系统架构分为4层,最上层是用户层,用户通过应用程序来使用系统,应用程序不能直接访问内核,它需要通过内核提供的API接口来访问内核,因此第二层是系统调用层,该层主要是内核提供的API接口,第三层是内核层,内核层直接控制硬件,第四层是硬件设备层。例如用户在用户层执行ls命令,ls应用程序通过调用第二层的文件操作API,API调用第三层内核的存储设备读取模块,存储设备读取模块直接从存储设备读取目录信息。从Linux系统架构图可以看出,不同Linux发行版厂商基于相同的Linux内核开发和封装Shell、包管理器、系统工具、桌面环境、磁盘管理、服务管理等。在内核层面采用官方稳定版内核,打上少量补丁、安全更新、适配优化,配置并编译大量硬件驱动模块(硬件驱动由硬件厂商 和内核社区开发,合入 Linux 内核主线),最终形成发行版。三、内核架构
Linux内核采用单内核设计,是指整个内核作为一个单独的二进制程序运行,所有核心功能(进程管理、内存管理、文件系统、驱动、网络)全部编译成一个大程序,共享同一地址空间,功能模块之间通过直接函数调用实现高效通信。图 Linux内核架构Linux内核的所有功能模块共享同一地址空间,即所有内核里的代码,都在同一个内存地址范围里,互相之间可以直接访问、直接调用。用户空间的程序代码和内核代码不在同一个地址空间,因此不能直接访问内核代码,只能通过内核对外提供的系统调用接口来访问内核。Linux 设备驱动支持以 LKM(可加载内核模块)形式实现,驱动程序可脱离内核源码独立编译,由厂商或开发者单独开发为 .ko 文件,无需重新编译内核、无需重启系统,即可动态加载到内核运行,实现设备驱动功能。四、进程管理
在Linux系统,每启动一个应用程序,内核就会创建一个进程,该进程拥有独立虚拟地址空间(代码段、数据段、堆、栈、页表独立),进程之间默认不能互相访问地址空间。当用户启动多个应用程序时,内核会启动多个进程,每个进程拥有独立的地址空间并占用内存、CPU 等系统资源。由于系统中同时存在多个进程竞争 CPU 与资源,因此需要内核的进程管理模块统一负责进程的调度、状态控制、资源分配与执行顺序管理,以保证多任务并发运行。为方便系统对进程的管理和调度,内核会为每个进程创建一个进程描述符(task_struct 结构体),该结构体记录进程 ID、状态、优先级等核心信息。进程有运行、就绪、阻塞、暂停、终止5个核心状态,调度器通过状态切换来实现进程的调度。内核将进程分为普通进程(CFS 调度)和实时进程(实时调度),实时进程优先级更高。CFS 作为默认调度器,通过虚拟运行时间和红黑树,保证进程公平获取 CPU。进程生命周期包含创建、调度、运行、终止,核心系统调用为 fork ()、exec ()、exit ()。进程间通过管道、消息队列、共享内存等 IPC 机制通信,其中共享内存效率最高。整体核心是通过合理的调度和管理,实现进程高效、公平运行及进程间协同。五、内存管理
在Linux系统,所有程序看到的都是虚拟地址空间,内核通过页表将虚拟地址映射到物理内存,当物理内存不够时,就把不常用的内存页换出到 Swap 分区。虚拟内存就是把一部分硬盘空间临时当内存(RAM)来用,用来缓解物理内存不够用的情况。当你同时开很多软件,物理内存不够时,系统就会把暂时不用的数据挪到虚拟内存里,腾出空间给正在用的程序。虚拟地址与物理地址通过页表(由MMU内存管理单元)进行映射,实现进程地址空间隔离,同时避免物理内存不足的问题。图 虚拟地址与物理地址映射框图上图完整展示了虚拟地址到物理地址的映射机制。其核心工作流程描述如下:- MMU(内存管理单元)通过页表,将虚拟地址转换为物理地址
- 当物理内存不足时,通过页面置换算法将部分数据换出到磁盘交换区,腾出空间。
对进程A和进程B来说,都拥有独立的虚拟地址空间,即拥有一整块连续、独占的内存空间,进程完全不知道底层物理内存的实际情况。虚拟地址空间到物理内存的转换由MMU内存管理单元完成,它通过页表完成映射。页表的核心结构:
字段 | 作用 |
虚拟页号 | 虚拟地址按页大小划分后的索引,用来在页表中查找 |
物理页号 | 对应虚拟页在物理内存中的实际页框号 |
有效位 | 标记该虚拟页是否已加载到物理内存(1 表示有效,0 表示缺页) |
转换过程:
MMU 根据虚拟页号查页表,拿到物理页号,拼接偏移得到最终物理地址。物理地址空间对应物理内存的实际存储单元,被划分为固定大小的物理页框(PF1、PF2),多个进程的虚拟页,可以映射到不同的物理页框,也可以共享同一个物理页框(如不同进程调用同一个共享库)。当进程访问的虚拟页不在物理内存中(页表有效位为 0),就会触发缺页中断,内核收到中断后,会通过页面置换算法(如 LRU、FIFO)选择一个暂时不用的物理页框(PF3),如果被选中的页框数据被修改过,就会先把它写回磁盘交换区,然后从磁盘交换区读取需要的虚拟页数据,加载到腾出的物理页框中,最后更新页表,标记该虚拟页的有效位为 1,映射到新的物理页框。六、文件系统
Linux为什么说一切皆文件,其核心设计思想就是统一接口、简化设计、降低复杂度,让万物都能用同一套 API 操作。Linux的这个设计思想源自于UNIX 的经典设计:系统里的所有资源,本质都是可读可写的数据流,与其为每个设备、进程、网络做一套独立接口,不如全部抽象成文件,这种设计思想可以让内核极度精简,应用程序也不需要面对多个API接口。这里的 “文件” 并非一定是磁盘上的普通文件,而是内核提供的统一抽象接口,通过 VFS 虚拟文件系统层屏蔽底层差异,实现对各类资源的一致访问。虚拟文件系统(Virtual File System)是Linux内核的核心抽象层,它将硬盘、键盘、进程信息等所有资源均抽象为文件,提供统一的文件操作接口(open、read、write、close),使应用程序无需关心底层硬件或文件系统类型,实现同一程序在不同 Linux 环境、不同文件系统上可直接运行。它向上为用户空间提供统一接口,向下管理各类存储与 I/O 设备。上图描述了Linux 文件打开(open)与读取文件的调用链,核心是 VFS 作为统一入口,层层向下委托,最终由磁盘硬件完成数据读取,具体调用过程如下:- 应用程序调用内核对外接口 open()函数打开文件,open() 会触发系统调用,CPU 从用户态切换到内核态,进入 VFS 处理流程;
- VFS 虚拟文件系统将文件路径解析为目录项(dentry)和索引节点(inode),在内核中为该进程分配一个未使用的文件描述符,后续读写操作都通过这个 fd 标识文件;
- VFS 是抽象层,不直接管理磁盘数据,它会根据文件所在的文件系统类型(如 ext4、xfs),委托给对应的文件系统驱动处理。文件系统通过 inode 找到文件数据在磁盘上的物理块位置;
- 此时还不会直接读磁盘,而是先查询内核页缓存,如果文件数据已经在缓存中,直接返回缓存中的数据,无需访问磁盘,如果数据不在缓存中,需要向下发起磁盘 I/O 请求,从物理磁盘读取数据;
- 块设备+I/O调度优化磁盘 I/O 请求,提升读写效率,它屏蔽了不同磁盘设备的差异,为上层提供统一的块设备接口;
- 磁盘驱动通过 DMA(直接内存访问) 方式,将磁盘上的数据直接读取到内核的缓存中,无需 CPU 参与数据拷贝。
七、网络协议栈
Linux网络协议栈核心功能是实现TCP/IP协议族,提供网络通信能力,支持数据包的发送、接收、转发和过滤,为上层应用提供Socket接口,是Linux实现网络连接的核心。Linux系统的上层应用只管发数据,不用管怎么拆包、寻址、校验、数据如何传输,网卡只管收发电信号,不用管数据是什么含义,网络协议栈就是中间的 “翻译 + 打包 + 调度 + 校验” 中心,专门负责把应用的简单数据,变成网卡能发的电信号,再把网卡收到的电信号,还原成应用能看懂的数据。网络协议栈具体来说就是充当应用程序和网卡之间的中间层,向上为应用提供简单接口,屏蔽网络复杂细节,向下驱动网卡收发数据,处理封装、寻址、校验、传输等所有底层工作。Linux 网络协议栈严格对应 TCP/IP 四层模型,每一层只干自己的事:提供应用程序的网络接口(Socket API),包含HTTP、FTP、SSH等应用层协议,对应内核源码net/socket/。负责端到端的通信,提供可靠传输(TCP)和不可靠传输(UDP),核心功能包括端口复用、流量控制、拥塞控制,对应内核源码net/ipv4/tcp.c、net/ipv4/udp.c。负责数据包的路由和转发,实现IP地址寻址,包含IP、ICMP、ARP等协议,对应源码net/ipv4/。负责数据包的帧封装和物理传输,与网络设备驱动交互,包含以太网、WiFi等链路层协议,对应源码net/core/、drivers/net/。本节总结
当前Linux内核最新正式稳定版是Linux 6.19.9,最新主线开发版是Linux 7.0,内核由全世界开发者共同维护,但由 Linus Torvalds 主导。Linux内核的授权协议为GPL v2,允许开发者自由修改和分发代码,因此我们可以完整获取Linux内核源代码,获取内核源代码的方式可以通过官方网站下载源代码压缩包,也可以通过git工具来下载最新、完整的内核源代码。Linux系统整体架构由用户层、系统调用API、内核和硬件构成,用户层的应用程序通过系统调用API与内核交互,由内核完成与硬件的交互。不同Linux发行版厂商基于相同的Linux内核开发和封装Shell、包管理器、系统工具、桌面环境、磁盘管理、服务管理等。在内核层面采用官方稳定版内核,打上少量补丁、安全更新、适配优化,配置并编译大量硬件驱动模块(硬件驱动由硬件厂商 和内核社区开发,合入 Linux 内核主线),最终形成发行版。Linux内核采用单内核设计,整个内核作为一个单独的二进制程序运行,所有核心功能(进程管理、内存管理、文件系统、驱动、网络)全部编译成一个大程序,共享同一地址空间,功能模块之间通过直接函数调用实现高效通信。