Linux内核架构和基础概念

文章目录

  • 前言

    一、简述操作系统

    二、宏内核和微内核

    1.宏内核

    2.微内核

    3.Linux内核的特点

    三,Linux内核架构

    1.整体架构图

    2.Linux子系统的划分

    3.Linux子系统之间的关系

    4.Linux内核目录介绍

    总结


前言

随着Linux内核在全球市场份额的持续扩大,其影响力已深深渗透至各行各业,尤其在服务器领域乃至我们所熟知的前沿行业,更是彰显出无可匹敌的重要性。因此,本系列文章旨在系统性地记录我深入探索与学习Linux内核过程中的心得体会与关键笔记。

本文主要是描述一下内核学习过程中的一些常用的概念,宏内核和微内核,内核架构等等。


一、简述操作系统

        我们经常接触的操作系统就是windows了,在操作系统这个强大的帮手下,我们可以使用鼠标点点就实现了某些功能,比如打开相机,打开某个APP,根本不用关心摄像头具体怎么操作,显卡怎么配置等等。所以操作系统不仅是构筑应用程序开发和运行之基石,更为程序的高效稳定执行提供了坚实的底层框架。其核心职能可以从两大基本维度加以阐述:

  • 首要维度在于,操作系统的核心任务在于精心构建并持续维护一个安全稳固的应用程序执行空间,这一基础服务是操作系统不可分割的基本属性,它确保每个应用程序得以在受保护且有序的状态下运作。
  • 另一方面,操作系统承载着至关重要的责任,即作为硬件资源访问和管理的有效协调者,服务于多用户及多元化的应用程序需求。操作系统通过精妙的策略实现资源的公平分配和高效调度,从而确保各类硬件资源得到充分且合理的利用。

再者,现代操作系统,如Linux内核,进一步引入了一系列先进特性以增强性能和灵活性。其中,虚拟化技术尤为突出。这种“虚拟性”体现在操作系统通过底层的抽象、仿真或分区机制,使得物理硬件资源看似为各个应用程序提供独立且专享的服务,从而有效支撑多任务并发执行、不同操作系统实例的隔离运行,以及建立资源隔离的安全用户环境等多种复杂场景下的操作模式。

Linux内核和操作系统的区别:

首先Linux内核并不完全等同于操作系统。Linux内核是操作系统的核心组件,它构成了操作系统的心脏部分,负责管理系统硬件资源,如处理器、内存、磁盘和其他I/O设备,并提供系统调用接口供其他软件使用。然而,一个完整的操作系统除了内核之外,还包括了许多其他的软件组件,例如:

  • Shell:用户与系统交互的接口,如Bash shell;
  • 系统库:提供给应用程序调用的函数库,如C标准库、POSIX库等;
  • 实用工具和命令:用于日常管理、文件操作、网络配置等各种用途的命令行工具;
  • 图形用户界面(GUI):如X Window系统、GNOME、KDE等桌面环境;
  • 应用程序:办公软件、浏览器、媒体播放器等各种最终用户使用的软件;
  • 服务:如网络服务、打印服务、数据库服务等;
  • 编程工具:编译器、调试器、版本控制系统等;
  • 系统配置和初始化脚本:用于系统启动和运行时配置;
  • 中间件:各种运行时环境,如Java虚拟机、解释器等。

因此,当我们提到Linux操作系统时,通常指的是一个包含了Linux内核以及围绕内核构建起来的各种软件和服务的整体系统,这些共同构成了一个能够满足用户和应用程序需求的操作平台。而Linux内核只是这个大系统中的一个必不可少的基础部分。

二、宏内核和微内核

概述:首先在操作系统内核设计主要分为两种主流结构:一是宏内核架构,另一种则是微内核架构。尽管随着时间推移,两者在细节上可能有所演变和发展,但这一基本分类仍然适用,并在当前的操作系统设计中占据主导地位。

1.宏内核

        概念:宏内核这一概念是指一类特定的操作系统内核设计模式。在宏内核架构中,实际上,宏内核是指将操作系统内核的所有核心服务和子系统(如进程管理、内存管理、文件系统及各种设备驱动等)作为一个整体进行设计和编译,最终生成单一的二进制内核映像文件。

        优点:由于这个文件在加载后,所有内核代码都运行在同一特权级别下的大内核地址空间内,这意味着内核内部的各个组件可以直接互相调用和访问硬件资源,从而实现了高效的执行和响应速度。

        缺点:但是宏内核稳定性较差,如果宏内核中的某个模块发生故障,可能导致整个内核崩溃,因为所有服务共享同样的地址空间,一个模块的问题可能会波及其他模块。并且随着系统功能的增加,宏内核的设计可能变得庞大而复杂,新增功能往往需要对现有内核进行较大改动,而且错误容易传播。

2.微内核

        概念:微内核是一种操作系统内核设计范式,它强调内核的小型化和模块化。在微内核架构中,内核仅包含了最基本的服务,如进程间通信(IPC)、线程调度、内存管理和中断处理等核心功能。这些核心服务位于特权模式下运行,确保了系统的基本安全性和稳定性。

        微内核的设计理念是将传统的内核功能尽可能地移到用户空间中去,成为独立运行的服务器进程。这样,大部分系统服务,如文件系统、设备驱动、网络协议栈等,不再直接集成在内核内部,而是作为用户级服务进程存在。这些服务进程通过微内核提供的高效、安全的消息传递机制相互通信和交互。

        优点:由于服务模块化,它们可以在不重启系统的情况下添加、删除或更新,增强了系统的灵活性和可扩展性。而且服务之间通过消息传递进行通信,而不是直接共享内存,提高了系统之间的隔离度,有利于安全和容错设计。

        缺点:频繁的消息传递可能带来额外的性能损失,尤其是在处理大量系统调用时,相较于宏内核直接调用函数的方式,可能存在一定的效率劣势。设计一个高效的微内核消息传递机制及其API会带来一定的复杂性,且过度的通信可能会导致性能瓶颈。

3.Linux内核的特点

        Linux内核在设计上并非典型的宏内核或微内核,而是表现出一种混合式的特性。Linux内核最早起源于宏内核设计,即将大量操作系统服务集成在内核空间中直接执行。随着时间的推移,Linux内核吸取了微内核的一些思想,例如模块化设计,使得部分服务可以通过模块化的方式加载到内核中,类似于微内核架构中的服务模块,但它们并不像微内核那样通过消息传递机制在用户空间中运行。

        因此,可以说Linux内核结合了宏内核的高效性和微内核的模块化特点,形成了一种折衷方案,被称为混合内核(或单体-微混合内核)。这样,Linux内核在实际运作中既能保持较高的性能,又能实现一定程度的灵活性和可扩展性。

三,Linux内核架构

1.整体架构图

Linux操作系统以其开源、稳定和高效的特点,在服务器领域占据了主导地位。本文将从宏观角度介绍Linux内核的整体架构,帮助读者了解其核心组成部分。

①、用户空间与内核空间

Linux系统采用的是分层设计思想,主要分为用户空间和内核空间两部分。用户空间是应用程序运行的环境,包括进程1(如shell)、glibc库等;而内核空间则是操作系统的核心,负责管理硬件资源和提供服务给用户空间的应用程序。

②、系统调用层

作为连接用户空间与内核空间的重要桥梁,系统调用层提供了各种接口供应用程序使用。这些接口涵盖了内存管理、中断处理、字符设备/块设备操作以及网络通信等方面的功能。

③、内核空间详细功能模块

  • 内存管理:包括虚拟地址映射、页面交换策略以及物理内存分配等机制。
  • 中断管理:处理来自硬件的各种中断请求,并调度相应的中断服务例程进行响应。
  • 字符设备/块设备驱动:为特定类型的硬件设备提供访问接口,例如硬盘、键盘等。
  • 网络设备驱动:支持TCP/IP协议栈以及其他网络协议的实现。
  • 文件系统:定义了如何组织存储数据的方式,并提供统一的操作接口。
  • 进程调度:根据一定的算法选择合适的进程执行,并保证公平性。
  • 总线设备抽象层:对USB/PCI等总线上的外设进行管理和控制。

④、体系结构Arch抽象层

为了提高代码复用率并降低移植难度,Linux内核引入了体系结构抽象层。该层屏蔽了不同硬件平台之间的差异性,使得开发者可以专注于编写通用功能代码。

⑤、设备管理抽象层

在这一层次上,Linux内核实现了对各种外部设备的统一管理。通过注册/注销机制来动态添加或删除设备驱动程序,从而增强了系统的灵活性。

⑥、硬件层面

最底层是硬件部分,包括CPU、内存条以及各种外部设备。它们构成了整个计算机系统的基石,并为上层软件提供了运行的基础。

通过对Linux内核整体架构的剖析,我们可以清晰地了解到它如何协调各个组件共同工作以满足用户需求。同时,这种分层设计也使得开发人员能够更加专注地完成各自的任务,提高了生产效率。随着技术的进步,相信未来会有更多优秀的特性被加入到这个强大的操作系统中去。

2.Linux子系统的划分

一般我们将Linux内核划分为五大子系统分别为内存管理(MM),文件系统(VFS),进程调度(SCHED),网络(NET),进程间通信(IPC)

  • 内存管理子系统 (Memory Management, MM)

    • 内存管理子系统是内核中最关键的部分之一,它负责管理和分配系统的物理内存以及管理虚拟内存空间。此子系统包含内存分配器、页表管理、内存区域管理、交换空间管理、内存映射以及内存保护等功能。它确保不同进程间的数据安全隔离,并通过页面替换算法提高内存利用率,同时还能通过虚拟内存技术实现超出实际物理内存大小的内存寻址。
  • 文件系统子系统 (Filesystem, FS or VFS)

    • 虚拟文件系统(Virtual File System, VFS)是Linux内核中抽象出来的通用文件系统接口,它为用户空间提供了一致的方式来访问各种不同的文件系统,如ext4、XFS、FAT、NFS等。VFS支持文件、目录的创建、删除、打开、关闭、读写等一系列操作,并协调具体的文件系统驱动程序完成相应的I/O操作。VFS还支持文件系统挂载、umount以及各种文件系统元数据的管理。
  • 进程调度子系统 (Process Scheduler, SCHED)

    • 进程调度子系统负责决定哪些进程或线程在何时获得CPU的执行权。它基于优先级、进程状态、时间片等多种因素做出决策,确保系统的并发性和响应性。Linux内核提供了多种调度策略,如CFS(完全公平调度器)用于普通进程调度,实时调度策略用于满足硬实时需求。
  • 网络子系统 (Network Stack, NET)

    • 网络子系统包含了实现网络通信所需的全套协议栈,从数据链路层到传输层(如TCP/IP协议)直至应用层接口。它管理网络接口设备、处理网络数据包的接收和发送、实现路由表管理、网络地址转换(NAT)、防火墙规则、以及socket编程接口等。内核中的网络子系统不仅要与硬件网络接口协同工作,还需要与其他内核子系统(如内存管理和进程调度)紧密配合。
  • 进程间通信子系统 (Interprocess Communication, IPC)

    • 进程间通信子系统为不同进程间的数据交换和同步提供了手段。Linux内核支持多种IPC机制,包括管道(pipe)、命名管道(FIFO)、信号(signal)、消息队列(message queue)、共享内存(shared memory)、信号量(semaphore)以及套接字(socket)等。这些机制使得进程能够安全高效地共享信息、协调执行顺序以及协同工作。

3.Linux子系统之间的关系

下图描述了Linux内核中五大子系统的相互调用关系:

  • 内存管理:

    • 硬件有关:这部分与硬件紧密相关,负责处理物理内存分配、页面替换算法等。
    • 硬件无关:这部分与具体的硬件平台无关,例如虚拟内存管理和内存映射。
  • 虚拟文件系统(VFS):

    • 逻辑文件系统:这是用户空间看到的抽象接口,提供统一的API来访问各种底层文件系统。
    • 硬件驱动程序:这些是用于特定设备的低级驱动,如磁盘控制器或闪存设备。
  • 进程调度:

    • 进程调度是内核的核心功能之一,它决定哪个进程应该在什么时候运行,并确保公平性和响应性。
    • 它与内存管理和虚拟文件系统密切相关,因为进程需要内存和文件系统资源才能执行。
  • 进程间通信(IPC):

    • IPC允许不同进程之间共享数据和同步操作,这对于多线程和多进程应用程序至关重要。
    • 它依赖于内存管理以确保正确地分配和保护共享内存区域。
  • 网络模块:

    • 网络协议:这部分实现各种网络协议,如TCP/IP,以支持网络通信。
    • 硬件驱动程序:这些驱动程序控制网络适配器和其他网络硬件。

这些子系统通过内核中的各种结构和机制进行交互。例如,进程调度器会考虑当前可用的内存情况来做出决策;文件系统需要内存缓冲区来缓存数据;网络模块使用内存缓冲区来存储待发送的数据包等等。这种复杂的交互使得内核能够高效地管理计算机资源并为用户提供一致且可靠的服务。

4.Linux内核目录介绍

下面以Linux版本为4.4.4介绍Linux源码目录的主要内容

①源码下载

地址:The Linux Kernel Archives

②源码目录分析


总结

本文上述内容主要从操作系统概念出发,解释了经常提到的Linux内核和操作系统的区别。然后以内核的设计角度,宏内核和微内核的优缺点解释了Linux内核的设计理念。最后详细赘述了Linux内核的架构和子系统划分以及子系统之间的交互关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/489267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用WebClient发起网络请求

目录 1、导入对应的pom 2、编写WebClientUtil请求工具类 3、使用WebClientUtil发起请求 使用WebClient的优点:支持lambdas 的函数;支持更高的并发性和更少的硬件资源;支持同步和异步;支持流式传输。具体的使用方式如下&#xff1a…

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 二、特性(为什么要用Redis&#x…

51单片机入门:定时器与中断系统

定时器的介绍 定时器:51单片机的定时器属于单片机的内部资源,其电路的设计连接和运转均在单片机内部完成。根据单片机内部的时钟或者外部的脉冲信号对寄存器中的数据加1,定时器实质就是加1计数器。因为又可以定时又可以计数,又称…

数据结构——排序之冒泡排序

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

HarmonyOS入门笔记1配置环境

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式进入配置…

Python爬虫:爬虫基本概念、流程及https协议

本文目录: 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

An Experimental Study of State-of-the-Art Entity Alignment Approaches论文阅读

最先进的实体对齐方法的实验研究综述 Title: An Experimental Study of State-of-the-Art Entity Alignment Approaches 日期: 2022 发表单位: IEEE github: https://github.com/DexterZeng/EAE 原文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9174835 概括…

启扬RK3568核心板助力智慧步道轻装健身,打造全民健康生活新方式

随着物联网、AI智能等新技术的快速发展&#xff0c;智慧步道成为全国各地公园建设和全民健身公共服务设施改造的新主题。智慧步道基于物联网、人脸识别、大数据分析等技术&#xff0c;对人们的运动进行监测和数据采集&#xff0c;显示运动数据&#xff0c;包括里程统计、热量消…

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

YOLOv5改进系列:主干ConvNeXTV2结构助力涨点

一、论文理论 论文地址&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 1.理论思想 ConvNeXt V2 在 ConvNeXt 的基础上增加了两个创新点&#xff08;一个 framework 和一个 technique&#xff09;&#xff1a;全卷积掩码自编码器&…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 1

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

nuxt3使用自定义组件

说明&#xff1a;nuxt3只有components文件夹里面的页面会自动注册为组件&#xff0c;但是有些单独的页面也需要组件&#xff0c;但是也不是全局的&#xff0c;所以写在pages里面的页面&#xff0c;需要手动注册为组件使用 1.创建组件 在pages里面创建页面文件夹&#xff0c;在…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…

【 Vue 3 】Vue3.0所采用的CompositionApi与Vue2.x使用的Options Api 有什么不同?

1. 开始之前 Composition API可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺点TypeScr…

搭建Spark单机版环境

在搭建Spark单机版环境的实战中&#xff0c;首先确保已经安装并配置好了JDK。然后&#xff0c;从群共享下载Spark安装包&#xff0c;并将其上传至目标主机的/opt目录。接着&#xff0c;解压Spark安装包至/usr/local目录&#xff0c;并配置Spark的环境变量&#xff0c;以确保系统…

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏&#xff0c;你的每一个赞每一份关注每一次收藏都将是我前进路…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

鸿蒙Harmony跨模块交互

1. 模块分类介绍 鸿蒙系统的模块一共分为四种&#xff0c;包括HAP两种和共享包两种 HAP&#xff08;Harmony Ability Package&#xff09; Entry&#xff1a;项目的入口模块&#xff0c;每个项目都有且只有一个。feature&#xff1a;项目的功能模块&#xff0c;内部模式和En…

在Semantic Kernel中使用Qdrant向量数据库

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库&#xff0c;并演示如何在Semantic Kernel中进行向量更新和查询操作。 1. 背景 在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中&#xff0c;我们介绍了如何使用 Docker 部署 Qdrant 向…
最新文章