Linux五大模块内核源码以及内核整体架构设计(图文详解)

本篇文章给大家带来了关于linux五大模块内核源码的相关知识,其中包括了内核整体架构设计的相关问题,希望对大家有帮助。

Linux五大模块内核源码以及内核整体架构设计(图文详解)

相关推荐:《Linux视频教程》

一、前言

本文是“Linux内核源码分析”系列的专业,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。

注:本文和其它的“Linux内核分析”文章都基于如下约定:
a) 内核版本为Linux 5.6.18,可以从下面的链接获取:
https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) 鉴于嵌入式系统大多使用ARM处理器,因此涉及到体系结构部分的内容,都以ARM为分析对象

二、 Linux内核的核心功能

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

f5846b91f0a21bd3342e90947659eddf.png

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

(代码免费获取后台私信【代码】)

三、Linux内核的整体架构

3.1 整体架构和子系统划分

390b06b9235eccb9233001ee307956a7.png

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

1. Process Scheduler,也称作进程管理、进程调度。负责管理CPU资源,以便让各个进程可以以尽量公平的方式访问CPU。

2. Memory Manager,内存管理。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用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个子模块(见下图),它们的功能如下:

86a4053c93c7e1860073eb332b4d1523.png

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个子模块(见下图),它们的功能如下:

d1484735f0c217b94b54852d8a3c0078.png

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个子模块(见下图),它们的功能如下:

a8badb9b4afdb772bbe12f67fc4b6486.png

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个子模块(见下图),它们的功能如下:

42d80603fa3e0ff5b2cacef441d375de.png

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. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件

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

6163cd168cb29f1cc0ce3b88a9bb1e7f.png

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视频教程》

以上就是Linux五大模块内核源码以及内核整体架构设计(图文详解)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/151081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月3日 10:35:29
下一篇 2025年12月3日 11:20:22

相关推荐

  • Java中如何生成XML 详解DOM方式创建XML文档

    使用dom方式创建xml文档的步骤如下:1. 创建documentbuilderfactory对象;2. 创建documentbuilder对象;3. 创建document对象;4. 创建根元素并添加到document对象;5. 创建子元素和文本节点;6. 将元素逐级添加到dom树;7. 使用tra…

    2025年12月5日 java
    000
  • 如何生成验证码?GD库图形处理教程

    生成验证码的核心在于服务器端图像处理技术,常用php的gd库实现。其步骤包括:1.创建画布并定义尺寸;2.分配背景、文字及干扰颜色;3.生成随机字符并存入session;4.绘制文字(可用imagettftext增加自然扭曲);5.添加干扰元素如点、线;6.输出图片并销毁资源。传统验证码仍有价值在于…

    2025年12月5日 后端开发
    000
  • linux重启网卡命令有哪些

    linux重启网卡命令有:1、命令【service network restart】;2、命令【ifconfig eth0 down / ifconfig eth0 up】;3、命令【ifdown eth0 / ifup eth0】。 本教程操作环境:linux7.3系统,DELL G3电脑。 li…

    2025年12月5日
    000
  • Java中Servlet的生命周期 图解Servlet从初始化到销毁的过程

    servlet的生命周期主要包括加载、初始化、处理请求和服务终止四个阶段。1.加载阶段:servlet容器在首次接收请求或启动时加载servlet类;2.初始化阶段:容器创建实例并调用init()方法,该方法仅执行一次,用于读取配置、建立数据库连接等初始化操作;3.处理请求阶段:每次请求到达时,容器…

    2025年12月5日 java
    000
  • linux find命令如何实现模糊查询

    linux find命令实现模糊查询的方法:根据文件名模糊查询,查找opt目录下后缀为【.log】的文件,代码为【find /opt/ -type f -name “*.log”】。 本教程操作环境:windows7系统、linux7.3版本,DELL G3电脑,该方法适用于…

    2025年12月5日 运维
    000
  • 0.198 超低风阻 AI 智能纯电轿车极越 07 首秀北京车展

    展览会随着新车发布、新技术展露,每一次的大型车展都是购车用户和汽车爱好者的最佳去处。本届北京车展将于4月25日开幕,极越作为高端智能汽车品牌,将携带 ” 最美 7 系 ” 极越 07 和 ai 智能纯电 suv 极越 01 双双亮相。 本届北京车展,极越以” 极越…

    2025年12月5日 硬件教程
    000
  • JavaScript金额格式化中多余空格的处理与预防

    本文旨在解决JavaScript函数在处理用户输入的逗号分隔字符串时,可能因多余空格导致格式化输出不准确的问题。我们将探讨导致这些空格出现的原因,并提供使用String.prototype.trim()方法来有效清除输入字符串中首尾空白字符的解决方案,确保数据处理的准确性和输出的整洁性。 在开发we…

    2025年12月5日
    000
  • PHP与SQLite数据库交互时如何优化查询的处理方法?

    合理使用索引能显著提升查询速度,但避免频繁更新字段加索引;2. 使用预处理语句减少重复解析开销,提高安全性与效率;3. 控制查询范围避免全表扫描,指定字段并用limit和offset分页;4. 合理使用事务合并写操作,提高批量数据处理效率。在sqlite中优化php查询需从索引设计、预处理、查询控制…

    2025年12月5日 后端开发
    000
  • 如何在Laravel中配置数据库索引

    在laravel中配置数据库索引的核心方法是使用迁移系统定义索引以提升查询性能。1. 在创建表时,可在schema::create回调中通过index()、unique()等方法直接添加索引;2. 对已有表,可创建新迁移文件并在schema::table中添加索引;3. laravel支持多种索引类…

    2025年12月5日
    100
  • win11开机后桌面加载很慢怎么办_win11启动慢进入桌面黑屏解决方法

    1、重启资源管理器可恢复黑屏桌面;2、清理%temp%文件释放系统资源;3、禁用高影响启动项提升开机速度;4、运行sfc和DISM修复系统文件;5、更新或回滚显卡驱动解决兼容性问题;6、创建新用户账户排除配置损坏可能。 如果您成功开机但进入桌面时出现加载缓慢或黑屏的情况,这通常与系统资源被过度占用、…

    2025年12月5日
    200
  • linux如何运行c程序命令

    linux运行c程序命令的方法:首先打开kali linux的终端,用vim工具打开文件并编写代码;然后输入【gcc test.cgcc】进行编译;最后再运行【test.out】在终端中输入【./test.out】。 本教程操作环境:linux7.3系统,DELL G3电脑。 linux运行c程序命…

    2025年12月5日 运维
    000
  • Composer提示Package not found如何解决_常见包找不到错误排查

    Composer提示“Package not found”通常因包名错误、版本不匹配、缓存问题、网络阻塞或仓库配置不当。首先检查composer.json中包名与版本是否正确,确认无误后清除缓存(composer clear-cache),再尝试重新安装;若仍失败,可删除vendor目录和compo…

    2025年12月5日
    000
  • vivo S30系列已开启预售,多彩小直屏+氛围感影像!

    5月30日,vivo s30系列新品正式开启预售,并将于6月6日全面开售。此次新机提供vivo s30与vivo s30 pro mini两款机型,起售价分别为2699元和3499元,购机用户还可享受多项专属福利。全系标配6500mah超大容量电池,结合多巴胺风格的撞色设计与旗舰级影像系统,带来全新…

    2025年12月5日 行业动态
    000
  • Java中XML怎么处理 详解Java DOM和SAX解析XML的方法

    java中处理xml主要有dom和sax两种方法。1.dom一次性加载整个文档到内存,形成树状结构,便于访问和修改,但内存消耗大,适合小文件;2.sax是事件驱动,逐行读取,内存占用小,适合大文件,但操作较复杂。此外还有jaxb、stax和xpath等方法,选择取决于文件大小、操作需求、性能及开发效…

    2025年12月5日 java
    000
  • Seer文件预览怎么调整亮度_Seer预览亮度调整的操作指南

    1、可通过快捷键Option+↑/↓实时调节Seer预览亮度;2、编辑config.ini文件设置brightness数值自定义默认亮度;3、使用Command+Shift+L启用暗色滤层优化高亮文件的显示对比度。 如果您在使用Seer进行文件预览时发现画面过暗或过亮,影响查看效果,可以通过调整预览…

    2025年12月5日
    000
  • 如何在Laravel中配置队列工作器

    在laravel中配置队列工作器的核心步骤是设置队列驱动并启动监听进程,以提升应用性能和用户体验。1. 修改.env文件中的queue_connection变量,如设为redis以启用高性能队列;2. 配置redis连接信息确保其可用性;3. 使用php artisan queue:work命令启动…

    2025年12月5日
    100
  • 解决PHPCMS配置伪静态后页面无法访问的问题

    1.phpcms配置伪静态后页面无法访问的核心原因通常在于服务器配置错误或phpcms后台设置不当。2.解决步骤依次为:确认apache或nginx的rewrite模块已启用并正确配置,检查phpcms后台是否开启伪静态及规则匹配,确保.htaccess(apache)或nginx配置文件中的伪静态…

    2025年12月5日 后端开发
    000
  • WebSocket怎样使用?实时通信教程

    websocket通过建立客户端与服务器间的持久连接实现双向实时通信,不同于http的“请求-响应”模式。1. 客户端使用javascript创建websocket实例并监听事件(onopen、onmessage、onclose、onerror)以处理连接状态和数据收发;2. 服务器端需使用支持we…

    2025年12月5日 后端开发
    000
  • 如何解决PHP异步代码测试的痛点,使用amphp/phpunit-util让测试更简单可靠

    最近在开发一个基于AMPHP的高性能API服务时,我深刻体会到了异步编程带来的效率提升。我们的服务需要处理大量的并发请求,并与多个外部服务进行非阻塞通信,AMPHP的Fiber和Promise机制让这一切变得可能。然而,当涉及到为这些异步逻辑编写单元测试时,我却遇到了前所未有的挑战。传统的PHPUn…

    开发工具 2025年12月5日
    000
  • Mac的“通用剪贴板”在iPhone上无法粘贴怎么办_苹果设备通用剪贴板同步问题修复

    首先检查并开启Mac和iPhone上的Handoff功能,确保蓝牙、Wi-Fi及同一iCloud账户正常,随后重启设备与系统服务,必要时通过终端命令重置剪贴板设置或重新登录iCloud以恢复跨设备粘贴功能。 如果您在Mac上复制了内容,但在附近的iPhone上无法粘贴,可能是由于设备间的连续互通功能…

    2025年12月5日
    000

发表回复

登录后才能评论
关注微信