前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux内核的整体架构

Linux内核的整体架构

作者头像
全栈程序员站长
发布于 2022-09-15 02:54:12
发布于 2022-09-15 02:54:12
1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

1. 前言

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

注:本文和其它的“Linux内核分析”文章都基于如下约定: a) 内核版本为Linux 3.10.29(该版本是一个long term的版本,会被Linux社区持续维护至少2年),可以从下面的链接获取:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.29.tar.xz b) 鉴于嵌入式系统大多使用ARM处理器,因此涉及到体系结构部分的内容,都以ARM为分析对象

2. Linux内核的核心功能

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

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

3. Linux内核的整体架构
3.1 整体架构和子系统划分

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

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子系统,由于功能比较单纯,这里就不再描述了。

4. 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 —- 帮助、说明文档。

5. 附录
5.1 参考资料

第3章各个子系统的架构图,拷贝自如下的网页: http://oss.org.cn/ossdocs/linux/kernel/a1/index.html

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163611.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
搭建一个你的文件共享站
说起文件共享,类似文件站这样的功能。在很久之前我使用过用apache httpd这个方案,这个的话就是太过于简单了。当然是满足需求的(又不是不能用) 今天来分享一个开源的文件共享平台。Pingvin Share 作者的github地址:https://github.com/stonith404/pingvin-share
huolong
2023/08/28
5360
搭建一个你的文件共享站
【Docker项目实战】使用Docker部署PicoShare共享文件平台
江湖有缘
2024/01/22
1.5K1
【Docker项目实战】使用Docker部署PicoShare共享文件平台
【Docker项目实战】使用Docker部署Jirafeau文件共享工具
江湖有缘
2025/01/06
4400
【Docker项目实战】使用Docker部署Jirafeau文件共享工具
【好玩儿的Docker项目】Pingvin Share——一个专注于文件分享的高颜值轻量小工具!
之前和大家介绍过的MicroBin主打的是文本代码分享功能,这周和大家推荐一个专注于文件分享的高颜值轻量小工具——Pingvin Share
二十五画生
2023/01/31
3.4K0
【好玩儿的Docker项目】Pingvin Share——一个专注于文件分享的高颜值轻量小工具!
用NAS搭建一个你的文件共享站,和基友分享你的那些好康的“东西” - 熊猫不是猫QAQ
大部分情况下大家分享nas中的文件都是通过直接生成连接的形式发给朋友,但如果有些东西我没有存在nas中,上传到nas再去生成链接再发给基友,多少有点不方便了,于是文件分享站变有了它存在的意义。我们可以将一些nas中没有存放的文件放上面供基友自行查看。
熊猫不是猫
2023/09/06
8180
用NAS搭建一个你的文件共享站,和基友分享你的那些好康的“东西” - 熊猫不是猫QAQ
【Docker项目实战】使用Docker部署FileGator文件管理器
江湖有缘
2024/02/03
3.1K0
【Docker项目实战】使用Docker部署FileGator文件管理器
【Docker项目实战】在Docker环境下部署go-file文件分享工具
江湖有缘
2023/12/09
1.6K1
【Docker项目实战】在Docker环境下部署go-file文件分享工具
【Docker项目实战】使用Docker部署FastSend文件传输工具
江湖有缘
2025/05/10
1650
【Docker项目实战】使用Docker部署FastSend文件传输工具
极简开源的文件共享系统,无需注册!
PicoShare 一款开源的文件共享系统,专注于提供图片、视频和其他文件的共享服务。项目基于Go语言编写,遵守AGPL开源协议。
永恒君
2023/09/02
8450
极简开源的文件共享系统,无需注册!
【docker】一款轻量的分享工具——Pingvin Share
项目地址:https://github.com/stonith404/pingvin-share
夜梦星尘
2024/08/20
3040
【docker】一款轻量的分享工具——Pingvin Share
PicoShare:轻量级文件共享系统的本地部署与远程访问指南
本篇文章介绍,如何在Linux系统本地部署轻量级文件共享系统PicoShare,并结合Cpolar内网穿透实现公网环境远程传输文件至本地局域网内文件共享系统。
FGGIT
2024/11/19
2640
PicoShare:轻量级文件共享系统的本地部署与远程访问指南
【Docker项目实战】使用Docker部署JmalCloud个人网盘
江湖有缘
2024/01/30
3.6K0
【Docker项目实战】使用Docker部署JmalCloud个人网盘
只使用简单的 JavaScript 创建文件共享型网站
Any Share 是一种简单、轻量、快速的文件共享服务。使用 Javascript 编写,并搭建在 Firebase 平台。
用户11164002
2024/06/17
8130
只使用简单的 JavaScript 创建文件共享型网站
FileCodeBox:Star4.9k,类似百度网盘,小团队、小公司都用得上的文件共享与分享工具,支持设置分享密码,界面清爽简单易用
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/01/27
1540
FileCodeBox:Star4.9k,类似百度网盘,小团队、小公司都用得上的文件共享与分享工具,支持设置分享密码,界面清爽简单易用
【好用的个人工具】Docker环境下部署FileDrop文件共享工具
江湖有缘
2023/12/07
2.8K4
【好用的个人工具】Docker环境下部署FileDrop文件共享工具
【实用的开源项目】使用服务器部署Sharry:真的很好用的文件分享程序!
【实用的开源项目】系列出到第五期了鸭。小俊因为上学以及其他事务的原因已经快三个月没有更新了,那今天为大家介绍一下 Sharry 这一款文件分享程序吧,这篇文章是详细的文字版,若希望查看教程视频,请向下滑动,查看视频,或者直接到 BiliBili 搜索 我是小俊呀 ,查找视频哦!
小俊是我
2022/12/24
1.1K0
【实用的开源项目】使用服务器部署Sharry:真的很好用的文件分享程序!
飞牛 fnos 使用docker部署 Windows 系统:虚拟机的轻量级替代方案
飞牛系统暂缺官方虚拟机,而 dockur/windows 这个开源项目能让 Windows 系统在 Docker 容器中运行,支持多版本(如 win7、win8、win10、win11、Win Server、Tiny Win)和多语言,很适合开发、测试以及学习场景,可快速搭建且自动部署,稳定又高效,是飞牛系统下 Windows 环境搭建的理想之选。
季春二九
2024/12/17
1.8K0
飞牛 fnos 使用docker部署 Windows 系统:虚拟机的轻量级替代方案
【Docker项目实战】使用Docker部署Mikochi文件管理工具
江湖有缘
2023/12/22
1.2K0
【Docker项目实战】使用Docker部署Mikochi文件管理工具
【Docker项目实战】使用Docker部署MicroBin粘贴应用程序
江湖有缘
2024/12/28
1800
【Docker项目实战】使用Docker部署MicroBin粘贴应用程序
【Docker项目实战】使用Docker部署Filestash文件管理器
江湖有缘
2024/09/18
1.1K0
【Docker项目实战】使用Docker部署Filestash文件管理器
推荐阅读
搭建一个你的文件共享站
5360
【Docker项目实战】使用Docker部署PicoShare共享文件平台
1.5K1
【Docker项目实战】使用Docker部署Jirafeau文件共享工具
4400
【好玩儿的Docker项目】Pingvin Share——一个专注于文件分享的高颜值轻量小工具!
3.4K0
用NAS搭建一个你的文件共享站,和基友分享你的那些好康的“东西” - 熊猫不是猫QAQ
8180
【Docker项目实战】使用Docker部署FileGator文件管理器
3.1K0
【Docker项目实战】在Docker环境下部署go-file文件分享工具
1.6K1
【Docker项目实战】使用Docker部署FastSend文件传输工具
1650
极简开源的文件共享系统,无需注册!
8450
【docker】一款轻量的分享工具——Pingvin Share
3040
PicoShare:轻量级文件共享系统的本地部署与远程访问指南
2640
【Docker项目实战】使用Docker部署JmalCloud个人网盘
3.6K0
只使用简单的 JavaScript 创建文件共享型网站
8130
FileCodeBox:Star4.9k,类似百度网盘,小团队、小公司都用得上的文件共享与分享工具,支持设置分享密码,界面清爽简单易用
1540
【好用的个人工具】Docker环境下部署FileDrop文件共享工具
2.8K4
【实用的开源项目】使用服务器部署Sharry:真的很好用的文件分享程序!
1.1K0
飞牛 fnos 使用docker部署 Windows 系统:虚拟机的轻量级替代方案
1.8K0
【Docker项目实战】使用Docker部署Mikochi文件管理工具
1.2K0
【Docker项目实战】使用Docker部署MicroBin粘贴应用程序
1800
【Docker项目实战】使用Docker部署Filestash文件管理器
1.1K0
相关推荐
搭建一个你的文件共享站
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1. 前言
  • 2. Linux内核的核心功能
  • 3. Linux内核的整体架构
    • 3.1 整体架构和子系统划分
    • 3.2 进程调度(Process Scheduler)
    • 3.3 内存管理(Memory Manager, MM)
    • 3.4 虚拟文件系统(Virtual Filesystem, VFS)
    • 3.5 网络子系统(Net)
  • 4. Linux内核源代码的目录结构
  • 5. 附录
    • 5.1 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档