前言

操作系统属于软件范畴,其核心职责是管理硬件资源并为应用程序提供运行环境。它需要具备三大核心功能:

  1. 提供应用程序执行环境
  2. 管理计算机硬件资源,支持多用户和多应用场景
  3. 实现虚拟化和并发处理能力

一、宏内核与微内核架构

1、宏内核

所有的内核代码都编译成一个二进制,所有的内核代码都运行在个大内核地址空间里,内核代码可以直接访问和调用,效率高并且性能好。具体架构如下:
在这里插入图片描述
2、微内核

采用模块化设计的操作系统将功能拆分为多个独立模块,各模块间需要通过消息传递进行通信,这种架构会带来一定的性能开销。如下:
在这里插入图片描述

总结:
宏内核架构的优点是设计简洁且性能优异,而微内核则在稳定性和模块化实时性方面具有显著优势。

工程实践中,Linux系统不断吸收微内核的先进理念,例如采用模块化设计思想并实现动态加载内核模块的功能。这使得Linux内核能够支持模块化开发,许多功能都可独立编译为模块,并实现动态加载与卸载(如各类设备驱动程序)。而传统的宏内核架构则缺乏这种灵活性,其结构类似于静态编译的结果,无法实现功能的动态调整。

二、linux内核体系架构以及内核各个子系统概要
在这里插入图片描述
Q1:为什么要有系统调用?

**系统调用的出现**
	OS允许CPU运行在用户态和内核态,Linux只使用ring0和ring3两种模式,来实现内核态和用户态。Linux内核为内核态和用户态之间切换提供机制,设计了软件抽象层,就是系统调用层System Call(本质是中断,中断是进入内核态的唯一方法)。
	用户程序可能大部分运行在用户态,但可能需要使用系统资源(例如磁盘),此时需要通过系统调用的方法进入内核空间。
	操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。(参考https://blog.csdn.net/weixin_38111957/article/details/130265874)

Q2:为什么要有体系结构Arch抽象层?

linux内核支持多种架构,例如ARM,X86等,目前已经支持几十种体系结构,而Arch抽象层抹去了不同架构之间的硬件差异,做了一层统一的抽象。在linux内核5.6.18版本的源码中,直接把不同架构做一个分目录操作,以提供对各个架构的支持。

在这里插入图片描述
在这里插入图片描述
Linux 内核的整体架构以进程调度器为中心,所有其余的子系统都依赖于进程调度器,因为其余子系统都需要阻塞和恢复进程。

进程调度器依赖内存管理器,当进程恢复执行时,需要依靠内存管理器分配供它运行的内存。IPC 子系统依赖于内存管理器,共享内存机制是进程间通信的一种方法,运行两个进程利用同一块共享的内存空间进行信息传递。

VFS 依赖于网络接口,支持 NFS 网络文件系统;VFS 依赖于内存管理器,支持 ramdisk 设备。内存管理器依赖于 VFS,因为要支持交换,可以将暂时不运行的进程换出到磁盘上的交换分区,进入挂起状态。

1、进程管理

进程就是处于执行期的程序,但进程并不仅仅局限于一段可执行程序代码,也就是代码段,通常进程还包括很多其它的资源,像打开的文件,挂起的信号,内核内部数据,处理器状态等。
linux支持多进程特性,可以最大化的使用cpu资源;用户可以在同一个cpu上运行多个用户程序。
进程管理是对操作系统中运行的进程进行创建、调度、同步、通信和死锁处理,确保程序的并发执行和资源共享。
进程调度控制着进程对 CPU 的访问。

1)哪些进程可以访问CPU资源呢?可运行进程可以访问CPU资源。

什么是可运行进程和不可运行进程?
“可运行进程”指的是那些已经准备好执行,并且可以被CPU调度的进程;
“不可运行进程”指的是那些由于某种原因(如等待资源、被阻塞等)无法执行的进程。

2)哪个进程优先访问CPU资源呢?进度调度器来选择

进程调度器会基于优先级的进程调度算法来选择一个进程运行,优先访问CPU资源。

2、内存管理
linux操作系统的内存分为物理内存和虚拟内存。因此Linux内存管理子系统,分为虚拟内存管理和物理内存管理,是 Linux 内核众多子系统中最为复杂最为庞大的一个。

虚拟内存管理有很多优点,主要包括地址映射、内存分配回收、页面置换、内存保护、共享内存、以及交换机制等功能。

前面说到进程可以访问CPU资源,那么进程是运行在哪里呢?其实无论是跑在用户态还是跑在内核态,进程能够看到的都是虚拟内存空间,进程看不到物理内存空间(被操作系统所屏蔽),这样多个进程可安全地共享主内存区域。

进程,其代码、数据和堆栈的总空间大小可以超过实际内存的大小,通常情况下,32 位系统是4GB。

用户的业务逻辑代码是借着许多的数据结构来处理的。首先进程通过虚拟内存地址访问这些数据结构的时候,虚拟内存地址会在内存管理子系统中被转换成物理内存地址(硬件无关部分),通过物理内存地址就可以访问到真正存储这些数据结构的物理内存了(硬件相关部分)。

物理内存管理是指操作系统对计算机硬件上的物理内存(RAM)进行管理,包括分配、释放内存,以及对内存的使用进行监控。核心任务是跟踪内存的使用情况,并根据需要分配和释放内存资源。此外,它还涉及内存的保护、交换以及缓存等功能。

3、虚拟文件系统(Virtual File System,VFS)

Linux虚拟文件系统(VFS)是所有文件系统实现的抽象层。它的核心目标是让上层应用和内核其他模块能以统一的方式访问任何类型的文件系统,无论这些文件系统是硬盘上的(如ext4、NTFS)、网络的(如NFS、Samba),还是内存虚拟的(如procfs、sysfs)。

VFS的核心目的是解决兼容性问题。

想象一下,Linux需要支持几十种文件系统(如ext4, Btrfs, XFS, FAT, NTFS, NFS, SMB/CIFS, proc, sysfs, tmpfs等)。

如果没有VFS:
	应用程序需要为每种文件系统实现不同的读写逻辑(如open(), read(), write())。
	内核需要为每种文件系统开发不同的挂载、管理代码。
	扩展支持新文件系统极其困难。

​VFS隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口(API),上层应用只需要调用VFS的标准接口(如 open(), read(), write(), close()),具体文件系统如何实现这些操作则由底层文件系统驱动负责。​

4、网络接口

Linux 网络子系统(Network Subsystem)是 Linux 内核中负责实现所有网络通信功能的复杂、多层次的框架,是整个操作系统联网能力的基石。网络子系统遵循 ​TCP/IP 模型的分层思想。它提供了对各种网络标准协议的存取和各种网络硬件的支持。

其主要层次和抽象包括:
​1)网络设备接口层 (Network Device Interface Layer - 驱动层)

负责管理物理和虚拟网络设备 (net_device)。这是与硬件或底层虚拟网络交互的入口。网络设备驱动程序负责与硬件设备行通信,每一种可能的硬件设备都有相应的设备驱动程序。

2)协议无关层 (Device-agnostic Layer)

提供与硬件无关的网络功能,隔离底层设备差异

3)​网络协议层 (Network Protocols Layer)

网络协议部分负责实现每一种可能的网络传输协议

4)​套接字层 (Socket Layer - 用户接口层)

提供 用户空间应用程序访问网络的标准 API ,实现“一切皆文件”的抽象,管理套接字状态

5、进程间通信(IPC)

linux内核支持进程间各种通信机制。

linux进程间通信有哪些呢?

1)管道(匿名管道pipe/命名管道(文件))
2)共享内存 nginx
mmap不等于share memory
mmap可以实现share memory的
3)消息队列
4) 信号
     kill -9pd
     kill -l 可以看到以下所有的信号![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e28feb05e03c40a29248472cb3e0ae8c.png)
5)信号量
   	 pv操作
6) socket

示例:编写代码实现linux进程间的通信

实现进程1和进程2的通信,如下图所示
1)从进程1 写入教据
2)从进程2 读取数据
3)进程2可立即接收到数据
		  		poll/select(epoll)
4)打开进程1和进程2的操作
	一个文件两部分组成
		 file   路径,属性 ls -l  索引
		 inode  具体数据
5)关闭进程1和进程2的操作
6)读取与写入的定位(lseek)

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐