Linux内核正是的基本体系结构说明/linux的说明

先用一张熟悉的图来说明 GNU/linux 的基本架构:

层次结构的上半部分是用户(或应用程序)空间,这是用户应用程序执行的地方。用户空间下面是内核空间,这是 Linux 内核所在的地方。Linux内核可以进一步分为三层:最上层是系统调用接口。用户程序被软件中断后,调用系统内核提供的函数。用户空间和内核提供的服务之间的这个接口称为系统调用。它实现了一些基本的功能,比如读写;系统调用接口下面是内核代码,可以更准确的定义为与架构无关的内核代码,是Linux支持的所有处理器架构通用的;

接着介绍Linux内核的五个子系统:

Linux内核主要由五个子系统组成:进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC),如图1所示。

1.进程调度

进程调度控制系统中多个进程对CPU的访问,使多个进程可以在CPU中“微串行、宏并行”执行。进程调度是系统的中心,内核中的其他子系统都依赖它,因为每个子系统都需要挂起或恢复进程。

图2 Linux进程状态转换

如上图 2 所示,Linux 进程在几种状态之间切换。在设备驱动程序编程中,当请求的资源不能满足时,驱动程序一般会调度其他进程执行,并使该进程进入休眠状态。在请求的资源被释放之前,它不会唤醒并进入就绪状态。睡眠分为可中断的睡眠和不可中断的睡眠。两者的区别在于,可以中断的睡眠会在收到信号时唤醒。

在设备驱动程序编程中,当请求的资源不能满足时,驱动程序一般会调度其他进程执行,相应的进程进入休眠状态。在请求的资源被释放之前,它不会唤醒并进入就绪状态。在设备驱动中,如果需要多个并发执行的任务,可以启动内核线程。启动内核线程的函数是:

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);

当用户使用系统提供的库函数进行进程编程时,用户可以动态创建进程,进程之间存在等待、互斥等操作,这些都是Linux内核实现的。Linux内核通过进程管理子系统实现与进程相关的操作。在Linux系统上,所有的计算工作都是通过进程来完成的。该过程可以是短期的(执行命令)或长期的(网络服务)。Linux系统是一个动态系统,可以通过进程管理来适应不断变化的计算需求。

在用户空间中,进程由进程标识符 (PID) 表示。从用户的角度来看,PID 是一个可以唯一标识一个进程的数值。一个PID值在进程的整个生命周期内是不会改变的,但是在进程被销毁后,这个PID可以被重用。创建进程有几种方法,可以创建新进程,也可以创建当前进程的子进程。

在Linux内核空间中,每个进程都有一个独立的数据结构,用来保存进程ID、优先级、地址空间等信息,这种结构也称为进程控制块(Process Control Block)。所谓进程管理,就是对进程控制块的管理。

Linux 进程是通过 fork() 函数系统调用生成的。调用 fork() 的进程称为父进程,产生的进程称为子进程。子进程创建时,除了进程ID,其他数据结构与父进程完全相同。fork() 系统调用创建内存后,立即将子进程加入内核的进程调试队列,然后使用 exec() 系统调用将程序代码添加到子进程的地址空间,然后子进程开始执行自己的代码。.

一个系统上可以有多个进程,但一般只有一个CPU,而且只有一个进程可以同时工作。即使有多个 CPU,也不可能有那么多进程。如果多个进程可以在 CPU 上工作,这就是进程管理子系统的工作。Linux内核设计了一种存储进程队列的结构。系统上会有几个队列来存储不同状态的进程。一个进程可以有几种状态,这些状态由操作系统具体定义,但至少包括三种状态:运行状态、就绪状态和等待状态。内核设计了相应的队列来存放相应状态的进程控制块。

当一个用户进程被加载时,它将进入就绪状态并被添加到就绪状态队列中。CPU时间轮换到就绪状态队列后,切换到进程的代码,进程执行,当进程的时间片到时换出。. 如果进程中发生了I/O操作,也会提前换出并存入等待队列。当 I/O 请求返回时,该进程将再次放入就绪队列。Linux系统设计了几种不同的进程队列管理方法,主要目的是提高进程调试的稳定性。

2.内存管理

内存管理的主要作用是控制多个进程对主内存区域的安全共享。Linux内存管理在CPU提供内存管理单元(MMU)的情况下,为每个进程完成虚拟内存到物理内存的转换。Linux 2.6 引入了对 MMUless CPU 的支持。

如下图3所示,一般情况下,Linux的每个进程享有4GB的内存空间,0-3GB属于用户空间,3-4GB属于内核空间,内核空间存在常规内存、I/O设备内存和高端内存。不同的处理方法。

图3 Linux进程地址空间

在使用虚拟内存技术的计算机中,内存管理硬件以分页的方式管理内存。分页方式是将计算机系统的物理内存按照相同的大小平均划分应用编程接口和套接字,每个内存段称为一个内存页,内存页的大小通常为4KB。Linux内核的内存管理子系统管理着虚拟内存和物理内存的映射关系,以及系统的可用内存空间。内存管理必须管理的不仅仅是 4KB 缓冲区。Linux 为 4KB 缓冲区提供抽象,例如slab 分配器。这种内存管理模式使用 4KB 缓冲区作为基础,然后从中分配结构,并跟踪内存页面使用情况,例如哪些内存页面已满,哪些未完全使用,哪些为空。

在支持多用户的系统上,由于内存使用量增加,物理内存很容易耗尽。为了解决物理内存耗尽的问题,内存管理子系统规定可以将页面移出内存并放在磁盘上,这个过程称为交换。内存管理的源代码可以在 ./linux/mm 中找到。

图片[1]-Linux内核正是的基本体系结构说明/linux的说明-老王博客

3.虚拟文件系统

如下图 4 所示,Linux 虚拟文件系统 (VFS) 隐藏了各种硬件细节,并为所有设备提供了统一的接口。而且,它独立于每个特定的文件系统,是各种文件系统的抽象。它使用超级块存储文件系统相关信息,使用inode inode 存储文件的物理信息,使用目录条目dentry 存储文件信息。逻辑信息。

图4 Linux文件系统

在不同格式的文件分区上,程序可以正确读写文件,结果是一样的。有时在使用linux系统的时候,发现文件可以直接拷贝到不同类型的文件分区中。对于应用程序来说,它不知道文件系统的类型,甚至不知道文件的类型。这就是虚拟文件系统在幕后所做的事情。工作。虚拟文件系统屏蔽了不同文件系统之间的差异,为用户提供了统一的界面。

虚拟文件系统,或 VFS(虚拟文件系统),是 Linux 内核中的一个软件抽象层。它通过一些数据结构及其方法,为实际文件系统如ext2、vfat等提供接口机制。通过使用同一套文件 I/O 系统调用,可以操作 Linux 中的任何文件,而无需考虑其所在的具体文件系统格式;此外,可以在不同的文件系统之间执行文件操作。在linux系统中,一切都可以看作是一个文件。不仅普通的文本文件和目录可以作为文件处理,字符设备、块设备、套接字等也可以作为文件处理。这些文件属于不同类型,但使用相同的操作方法。这也是 UNIX/Linux 设计的基本理念之一。

虚拟文件系统(简称VFS)是实现“一切皆文件”特性的关键。它是 Linux 内核的一个软件层,为用户空间程序提供文件系统接口;同时,它在内核中提供了一个抽象函数,允许不同类型的文件系统存在。VFS可以理解为一种抽象的接口标准。系统中的所有文件系统不仅要靠VFS共存,还要靠VFS协同工作。为了支持不同的文件系统,VFS定义了所有文件系统都支持的最基本的概念接口和数据结构。在实现特定的文件系统时,需要为 VFS 提供 VFS 标准的接口和数据结构。数据结构,不同的文件系统可能有不同的实体概念,但在使用VFS接口时,需要与VFS定义的概念保持一致。只有这样才能实现用户的文件系统独立性。VFS 隐藏了特定文件系统的操作细节,因此从 VFS 层和内核其余部分的角度来看,所有文件系统都是相同的。文件系统访问的系统调用由VFS软件层处理,VFS根据访问请求调用不同的文件系统驱动函数来处理用户请求。当文件系统的代码访问物理设备时,需要使用物理设备驱动程序来访问真实的硬件。所以从 VFS 层和内核其余部分的角度来看,所有文件系统都是相同的。文件系统访问的系统调用由VFS软件层处理,VFS根据访问请求调用不同的文件系统驱动函数来处理用户请求。当文件系统的代码访问物理设备时,需要使用物理设备驱动程序来访问真实的硬件。所以从 VFS 层和内核其余部分的角度来看,所有文件系统都是相同的。文件系统访问的系统调用由VFS软件层处理,VFS根据访问请求调用不同的文件系统驱动函数来处理用户请求。当文件系统的代码访问物理设备时,需要使用物理设备驱动程序来访问真实的硬件。

4.网络接口

网络接口提供对各种网络标准的访问和对各种网络硬件的支持。如下图5所示,在Linux中,网络接口可以分为网络协议和网络驱动。网络协议部分负责实现所有可能的网络传输协议,网络设备驱动负责与硬件设备通信。硬件设备有相应的设备驱动程序。

图5 Linux网络架构

编写网络应用程序,使用套接字通过 TCP/IP 协议与其他机器通信。与上面介绍的内核子系统类似,socket相关的功能也是通过内核子系统完成的。这部分任务是内核的网络子系统。,而这部分代码有时被称为“网络堆栈”。Linux内核提供了出色的网络处理能力和功能,这与网络栈代码的设计思想密不可分。Linux 网络栈部分遵循传统的层次结构。网络数据从用户进程到达实际的网络设备需要四个步骤。层:用户进程、套接字、网络协议、网络设备。

实际上,每一层可以分为很多层,数据传输路径是基于层的,不能跨越某一层。Linux网络子系统对网络层采用了类似的面向对象的设计思想,将需要处理的层抽象为不同的实体,并定义了实体与数据处理流程之间的关系:

(1)网络协议:网络协议可以理解为一种语言,用于网络中不同设备之间的通信应用编程接口和套接字,是一种通信规范。

(2)Socket:Socket是内核与用户程序的接口,一个socket对应一个数据连接,为用户提供文件I/O,用户可以像文件发送一样对数据连接进行操作并接收数据,具体的协议处理由网络协议部分处理,socket是用户使用网络的接口。

(3)设备接口:设备接口是网络子系统中软件和硬件之间的接口。用户的数据最终需要通过网络硬件设备进行收发。网络设备千差万别,设备驱动也不同. 接口掩盖了特定设备驱动程序的差异。

(4)网络缓冲区:网络缓冲区,也称为套接字缓冲区(sk_buff),是网络子系统中的一个重要结构。网络传输数据除了物理设备的影响外,还有很多不确定因素对传输数据的限制(如MMU)、网络干扰、丢包、重传等,都会造成数据不稳定,网络缓冲区对网络数据进行重组,使业务处理的数据包完整,网络缓冲区是一个内存 网络系统中的缓冲区是网络系统和内存管理之间的接口。

5.进程通信

进程通信支持提供进程之间的通信。Linux支持多种进程间的通信机制,包括信号量、共享内存、管道等,这些机制可以辅助多进程、多资源。消息传递。

子系统之间的依赖关系:

Linux内核的5个组件之间的依赖关系如下:

· 进程调度和内存管理的关系:这两个子系统相互依赖。在多道程序环境中,必须创建一个进程才能运行程序,而创建进程首先要做的就是将程序和数据加载到内存中。

进程间通信与内存管理的关系:进程间通信子系统依赖内存管理来支持共享内存通信机制,允许两个进程访问除自己的私有空间外的公共内存区域。

虚拟文件系统和网络接口的关系:虚拟文件系统使用网络接口来支持网络文件系统(NFS),也使用内存管理来支持RAMDISK设备。

内存管理与虚拟文件系统的关系:内存管理使用虚拟文件系统来支持交换,交换进程(swapd)是由调度器周期性调度的,这也是内存管理依赖进程调度的唯一原因。当进程访问的内存映射被换出时,内存管理器向文件系统发出请求,同时挂起当前运行的进程。

除了这些依赖之外,内核中的所有子系统都依赖于一些公共资源。这些资源包括所有子系统使用的例程,例如分配和释放内存空间的函数、打印警告或错误消息的函数以及系统提供的调试例程。

原始链接

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论