深入理解Linux Kernel内核整体架构(图文详解)

发布时间 - 2025-06-25 00:00:00    点击率:

一,前言

本文是“Linux内核分析”系列文章的首篇,将从内核的核心功能出发,描述Linux内核的整体架构以及其下主要的软件子系统。接着,本文会介绍Linux内核源文件的目录结构,并与各个软件子系统相对应。

注:本文及其他“Linux内核分析”系列文章基于以下约定:

a) 内核版本为Linux 3.10.29(该版本是一个长期支持版本,Linux社区将持续维护至少2年)。b) 考虑到嵌入式系统通常使用ARM处理器,因此涉及体系结构部分的内容均以ARM为分析对象。

二,Linux内核的核心功能如下图所示,Linux内核是Linux操作系统的一部分。向下,它管理系统的所有硬件设备;向上,它通过系统调用,向Library Routine(如C库)或其他应用程序提供接口。

添加描述

因此,其核心功能就是:管理硬件设备,供应用程序使用。现代计算机(无论是PC还是嵌入式系统)的标准组成包括CPU、Memory(内存和外存)、输入输出设备、网络设备和其他外围设备。因此,为了管理这些设备,Linux内核提出了如下的架构。

三,Linux内核的整体架构

3.1 整体架构和子系统划分

上图展示了Linux内核的整体架构。根据内核的核心功能,Linux内核提出了5个子系统,分别负责以下功能:

  1. 进程调度(Process Scheduler),也称为进程管理、进程调度。负责管理CPU资源,以便让各个进程能够以尽可能公平的方式访问CPU。
  2. 内存管理(Memory Manager)。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。此外,内存管理提供虚拟内存机制,该机制允许进程使用超过系统可用内存的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用时再取回到内存中。
  3. 虚拟文件系统(VFS,Virtual File System)。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(实际上,Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件,还得看贝尔实验室正在开发的“Plan 9”)。
  4. 网络子系统(Network)。负责管理系统的网络设备,并实现多种多样的网络标准。
  5. 进程间通信(IPC,Inter-Process Communication)。IPC不管理任何硬件,它主要负责Linux系统中进程之间的通信。

3.2 进程调度(Process Scheduler)

进程调度是Linux内核中最重要的子系统之一,它主要提供对CPU的访问控制。因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要“进程调度子系统”对CPU进行调度管理。

进程调度子系统包括4个子模块(见下图),它们的功能如下:

  1. Scheduling Policy,实现进程调度的策略,它决定哪个(或哪些)进程将拥有CPU。
  2. Architecture-specific Schedulers,体系结构相关的部分,用于将对不同CPU的控制,抽象为统一的接口。这些控制主要在suspend和resume进程时使用,涉及CPU的寄存器访问、汇编指令操作等。
  3. Architecture-independent Scheduler,体系结构无关的部分。它会与“Scheduling Policy模块”沟通,决定接下来要执行哪个进程,然后通过“Architecture-specific Schedulers模块”resume指定的进程。
  4. System Call Interface,系统调用接口。进程调度子系统通过系统调用接口,将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。

3.3 内存管理(Memory Manager, MM)

内存管理同样是Linux内核中最重要的子系统之一,它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因此不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。

内存管理子系统包括3个子模块(见下图),它们的功能如下:

  1. Architecture Specific Managers,体系结构相关部分。提供用于访问硬件Memory的虚拟接口。
  2. Architecture Independent Manager,体系结构无关部分。提供所有的内存管理机制,包括:以进程为单位的memory mapping;虚拟内存的Swapping。
  3. System Call Interface,系统调用接口。通过该接口,向用户空间程序应用程序提供内存的分配、释放,文件的map等功能。

3.4 虚拟文件系统(Virtual Filesystem, VFS)

传统意义上的文件系统,是一种存储和组织计算机数据的方法。它用易懂、人性化的方法(文件和目录结构),抽象计算机磁盘、硬盘等设备上冰冷的数据块,从而使对它们的查找和访问变得容易。因此,文件系统的实质,就是“存储和组织数据的方法”,文件系统的表现形式,就是“从某个设备中读取数据和向某个设备写入数据”。

随着计算机技术的进步,存储和组织数据的方法也在不断进步,从而导致有多种类型的文件系统,例如FAT、FAT32、NTFS、EXT2、EXT3等。而为了兼容,操作系统或内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。

我们可以从磁盘、硬盘、NAND Flash等设备中读取或写入数据,因此最初的文件系统都是构建在这些设备之上的。这个概念也可以推广到其他的硬件设备,例如内存、显示器(LCD)、键盘、串口等。我们对硬件设备的访问控制,也可以归纳为读取或者写入数据,因此可以用统一的文件操作接口访问。Linux内核就是这样做的,除了传统的磁盘文件系统之外,它还抽象出了设备文件系统、内存文件系统等。这些逻辑,都是由VFS子系统实现。

VFS子系统包括6个子模块(见下图),它们的功能如下:

  1. Device Drivers,设备驱动,用于控制所有的外部设备及控制器。由于存在大量不能相互兼容的硬件设备(特别是嵌入式产品),因此也有非常多的设备驱动。因此,Linux内核中将近一半的Source Code都是设备驱动,大多数的Linux底层工程师(特别是国内的企业)都在编写或者维护设备驱动,而无暇顾及其他内容(它们恰恰是Linux内核的精髓所在)。
  2. Device Independent Interface,该模块定义了描述硬件设备的统一方式(统一设备模型),所有的设备驱动都遵守这个定义,可以降低开发的难度。同时可以用一致的形式向上提供接口。
  3. Logical Systems,每一种文件系统,都会对应一个Logical System(逻辑文件系统),它会实现具体的文件系统逻辑。
  4. System Independent Interface,该模块负责以统一的接口(块设备和字符设备)表示硬件设备和逻辑文件系统,这样上层软件就不再关心具体的硬件形态了。
  5. System Call Interface,系统调用接口,向用户空间提供访问文件系统和硬件设备的统一的接口。

3.5 网络子系统(Net)

网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其他系统的功能。在Linux内核中,网络子系统几乎是自成体系,它包括5个子模块(见下图),它们的功能如下:

  1. Network Device Drivers,网络设备的驱动,和VFS子系统中的设备驱动是一样的。
  2. Device Independent Interface,和VFS子系统中的是一样的。
  3. Network Protocols,实现各种网络传输协议,例如IP, TCP, UDP等。
  4. Protocol Independent Interface,屏蔽不同的硬件设备和网络协议,以相同的格式提供接口(socket)。
  5. System Call interface,系统调用接口,向用户空间提供访问网络设备的统一的接口。

至于IPC子系统,由于功能比较单纯,这里就不再描述了。

四,Linux内核源代码的目录结构

Linux内核源代码包括三个主要部分:

  1. 内核核心代码,包括第3章所描述的各个子系统和子模块,以及其他的支撑子系统,例如电源管理、Linux初始化等。
  2. 其他非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其他的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等。
  3. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件。

下图是使用ls命令看到的内核源代码的顶层目录结构,具体描述如下:

include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。 kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。 mm/ ---- 内存管理子系统(3.3小节)。 fs/ ---- VFS子系统(3.4小节)。 net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。 ipc/ ---- IPC(进程间通信)子系统。 arch// ---- 体系结构相关的代码,例如arm, x86等。 arch//mach- ---- 具体的machine/board相关的代码。 arch//include/asm ---- 体系结构相关的头文件。 arch//boot/dts ---- 设备树(Device Tree)文件。 init/ ---- Linux系统启动初始化相关的代码。 block/ ---- 提供块设备的层次。 sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。 lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 crypto/ ----- 加密、解密相关的库函数。 security/ ---- 提供安全特性(SELinux)。 virt/ ---- 提供虚拟机技术(KVM等)的支持。 usr/ ---- 用于生成initramfs的代码。 firmware/ ---- 保存用于驱动第三方设备的固件。 samples/ ---- 一些示例代码。 tools/ ---- 一些常用工具,如性能剖析、自测试等。 Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。 COPYING ---- 版权声明。 MAINTAINERS ----维护者名单。 CREDITS ---- Linux主要的贡献者名单。 REPORTING-BUGS ---- Bug上报的指南。 Documentation, README ---- 帮助、说明文档。


# linux  # 操作系统  # 处理器  # 工具  # ai  # linux操作系统  # red  # 架构  # include  # Filesystem  # 接口  #   # Interface  # map  # 对象  # udp  # 嵌入式系统  # bug  # 文件系统  # 内存管理  # 虚拟内存  # 其他的  # 应用程序  # 都是  # 是一个  # 源代码  # 出了  # 管理系统 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Bootstrap CSS布局之列表  如何快速搭建高效WAP手机网站?  JavaScript Ajax实现异步通信  长沙企业网站制作哪家好,长沙水业集团官方网站?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  深圳网站制作的公司有哪些,dido官方网站?  C语言设计一个闪闪的圣诞树  如何用免费手机建站系统零基础打造专业网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  动图在线制作网站有哪些,滑动动图图集怎么做?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  js代码实现下拉菜单【推荐】  如何用IIS7快速搭建并优化网站站点?  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel Docker环境搭建教程_Laravel Sail使用指南  简历没回改:利用AI润色让你的文字更专业  Swift中循环语句中的转移语句 break 和 continue  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel如何配置和使用缓存?(Redis代码示例)  javascript中对象的定义、使用以及对象和原型链操作小结  如何在VPS电脑上快速搭建网站?  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel怎么清理缓存_Laravel optimize clear命令详解  Java解压缩zip - 解压缩多个文件或文件夹实例  做企业网站制作流程,企业网站制作基本流程有哪些?  免费视频制作网站,更新又快又好的免费电影网站?  如何彻底删除建站之星生成的Banner?  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  JavaScript如何实现音频处理_Web Audio API如何工作?  制作电商网页,电商供应链怎么做?  Laravel怎么上传文件_Laravel图片上传及存储配置  ,南京靠谱的征婚网站?  js实现点击每个li节点,都弹出其文本值及修改  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何用西部建站助手快速创建专业网站?  网站建设整体流程解析,建站其实很容易!  原生JS实现图片轮播切换效果  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Android okhttputils现在进度显示实例代码  网站建设保证美观性,需要考虑的几点问题!  PythonWeb开发入门教程_Flask快速构建Web应用  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  SQL查询语句优化的实用方法总结  如何用VPS主机快速搭建个人网站?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?