linux内核整体架构分析笔记

news/2024/7/20 11:38:30 标签: linux内核, 整体架构


一、整体架构与子系统划分

在这里插入图片描述
根据内核的核心功能, Linux 内核划分为 5 个子系统:

  • Process Scheduler,也称作进程管理、进程调度:负责管理 CPU 资源,以便让各个进程可以以尽量公平的方式访问 CPU。
  • Memory Manager,内存管理:负责管理 Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用 Memory 的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
  • VFS( Virtual File System),虚拟文件系统: Linux 内核将不同功能的外部设备,例如Disk 设备(硬盘、磁盘、 NAND Flash、 Nor Flash 等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口( open、 close、 read、 write 等)来访问。这就是 Linux系统“ 一切皆是文件” 的体现(其实 Linux 做的并不彻底,因为 CPU、内存、网络等还不是文件,如果真的需要一切皆是文件)。
  • 设备驱动: 负责管理第三方设备接入/终端。
  • Network,网络子系统:负责管理系统的网络设备,并实现多种多样的网络标准。


二、进程调度(Process Scheduler)

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

进程调度子系统包括4个子模块,功能如下:
在这里插入图片描述

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


三、内存管理( Memory Manager, MM)

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

内存管理子系统包括 3 个子模块(见下图),它们的功能如下:
在这里插入图片描述

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


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

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

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

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

VFS 子系统包括 6 个子模块(见下图),它们的功能如下:
在这里插入图片描述

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


五、网络子系统( Net)

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

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

http://www.niftyadmin.cn/n/1531485.html

相关文章

linux内核源码分析笔记

一、内核源码目录结构 1、Linux 内核源代码包括三个主要部分 1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理、linux初始化等。 2)非核心代码&…

C++11/14新特性--lambda、nullptr、constexpr、noexcept

一、lambda 1.lambda函数特点 lambda表达式是一种匿名函数,即没有函数名的函数;取而代之的多了一对方括号[];lambda函数还采用了追踪返回值类型的方式声明其返回值;匿名函数是由数学中的λ演算而来。在C11中,lambda函…

一个软件项目是如何实现的

1、首先制定项目计划,最初计划是里程碑性质的。可以先按瀑布模型设置,里程碑点主要为需求评审、设计评审、经过代码开发和单元测试后进行集成测试、部署上线是一个很重要的里程碑,一般用户会期望系统何时能使用进入试运行期(也可以…

C++11/14新特性--类型推导 auto、decltype

一、概要 在传统 C 和 C中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效率&#x…

Linux系统下搭建常用服务器

1、搭建telnet服务器 2、搭建DHCP服务器 3、搭建DNS服务器 4、搭建sendmail服务器 5、搭建FTP服务器 6、搭建web服务器 安装 apache tomcat 7、搭建samba服务器 一、搭建telnet服务器 1、查看是否有telnet服务 rpm –qa|grep tel…

C++11/14新特性--区间迭代、初始化列表

1、基于范围的for循环 1&#xff09;基于循环的迭代写法 int array[] {1,2,3,4,5}; for(auto &x : array) {std::cout << x << std::endl; }2&#xff09;容器遍历 std::vector<int> arr(5, 100); //arr数组包含5个100的元素//原来遍历方式for (std:…

Linux常用Shell脚本珍藏

我们在运维中&#xff0c;尤其是linux运维&#xff0c;都知道脚本的重要性&#xff0c;脚本会让我们的 运维事半功倍&#xff0c;所以学会写脚本是我们每个linux运维必须学会的一门功课&#xff0c;这里收藏linux运维常用的脚本。如何学好脚本&#xff0c;最关键的是就是大量的…