当前位置: 首页 > news >正文

Linux 内核和用户空间

核心概念:内核空间 vs 用户空间

现代操作系统(包括 Linux)采用了一种保护性架构,通常称为 保护环。这种设计将系统的核心部分与应用程序隔离开,以确保系统的稳定性和安全性。

  • 内核空间

    • 是什么:这是操作系统内核运行的特权模式。它拥有对硬件(CPU、内存、设备等)的完全、无限制的访问权限。

    • 权限级别:在 x86 架构中,它运行在 Ring 0(最高特权级别)。

    • 内容:内核代码、设备驱动程序、内存管理程序、进程调度程序等都运行在此空间。

    • 目标:稳定、高效、安全。一个内核的错误(如驱动程序bug)可能导致整个系统崩溃(内核恐慌)。

  • 用户空间

    • 是什么:这是所有用户应用程序运行的非特权模式。应用程序无法直接访问硬件或内核内存。

    • 权限级别:在 x86 架构中,它运行在 Ring 3(最低特权级别)。

    • 内容:你日常使用的所有程序,如浏览器、文本编辑器、终端、你编写的脚本等。

    • 目标:灵活、丰富。一个用户程序的崩溃通常只会影响它自己,不会波及整个系统。

重要比喻:可以把操作系统想象成一个餐厅

  • 内核空间厨房,厨师(内核)有最高权限使用所有厨具(硬件)来做饭。

  • 用户空间用餐区,顾客(应用程序)不能直接进厨房操作炉灶。他们必须通过服务员(系统调用)向厨房下单点菜。

Ring

“Ring”,中文常翻译为**“保护环”“特权级”,是CPU硬件级别提供的一种安全机制。它的核心思想是分级信任和权限控制**,为不同的程序代码赋予不同的硬件执行权限,从而保护核心系统代码和数据不被不可信的应用程序破坏。

在没有“保护环”概念的早期系统中,所有程序(包括操作系统和应用程序)都能平等地访问硬件资源。这意味着一个编写不良的应用程序(比如一个电子游戏)可以:

  • 随意覆盖操作系统的内存。

  • 直接向硬盘控制器发送错误的指令,导致数据损坏。

  • 让整个系统崩溃。

“保护环”机制就是为了解决这个问题而诞生的。它创造了两个世界

  • 特权世界(高Ring等级):运行最受信任的代码(操作系统内核),可以做任何事情。

  • 非特权世界(低Ring等级):运行普通应用程序,其行为受到严格限制。

它是如何工作的?—— 系统调用

当一个用户程序(Ring 3)需要内核(Ring 0)为其服务时(例如打开一个文件),它会执行一个特殊的指令(在x86上通常是 syscall 或 int 0x80)。

  • 触发:CPU执行到这个指令。

  • 切换:CPU会自动进行一个从Ring 3到Ring 0的权限提升的上下文切换。

  • 执行:CPU开始执行内核中预先设定好的、处理该系统调用的代码。此时CPU处于最高权限,可以完成任何操作。

  • 返回:内核完成工作后,执行另一个特殊指令(如 sysret)返回用户程序,CPU权限也降回Ring 3。

这个过程是硬件辅助的,非常高效和安全。用户程序永远无法“闯入”内核,只能通过这扇“大门”发出请求。

小结

  • Ring是CPU硬件特性,不是软件概念。

  • 它创造了权限等级,实现了隔离

  • Ring 0内核空间,权限最高。

  • Ring 3用户空间,权限最低。

  • 两者通过系统调用(硬件陷阱指令)安全地通信。

  • 这种机制是现代操作系统稳定性安全性的根本基石。一个崩溃的程序(Ring 3)不会让整个机器宕机,而一个内核(Ring 0)的崩溃(如驱动程序错误)则会导致系统彻底崩溃**(内核恐慌 Kernel Panic)**。

Linux内核

Linux 内核是整个操作系统的心脏和大脑。它是一个宏内核(Monolithic Kernel),意味着所有核心功能都运行在同一个特权空间内(尽管可以通过模块化扩展)。

内核的主要子系统:

  • 进程管理

    • 负责创建、销毁、调度进程和线程。

    • 多个进程共享 CPU 的核心算法由调度器实现,它决定下一个时间片由哪个进程运行。

    • 处理进程间的通信(IPC),如管道、信号、共享内存等。

  • 内存管理

    • 管理系统的物理内存和虚拟内存。

    • 为每个进程提供独立的虚拟地址空间,让每个进程都以为自己独享整个内存。

    • 实现分页、换页(Swapping)机制,将暂时不用的内存页交换到硬盘上,从而高效地利用有限的物理内存。

  • 文件系统

    • 提供了一个统一的虚拟文件系统(VFS)抽象层,隐藏了不同硬件设备(硬盘、U盘)和文件系统类型(ext4, XFS, Btrfs, NTFS)的差异。

    • 管理文件和目录的创建、读写、删除和权限控制。

  • 设备驱动与硬件管理

    • 包含了大量的设备驱动程序,作为硬件设备(如网卡、显卡、键盘、硬盘控制器)和操作系统之间的翻译官。

    • 内核通过驱动程序与硬件交互,而对上层应用则提供统一的接口。

  • 网络栈

    • 实现了复杂的网络协议栈(如 TCP/IP, UDP, ICMP)。

    • 处理数据包的路由、转发、过滤(通过 Netfilter 框架,即 iptables 的基础)。

  • 安全模块

    • 如 SELinux, AppArmor,提供了强制访问控制(MAC),对系统资源访问进行更细粒度的限制。

用户空间详解

用户空间是所有非内核软件运行的环境。它不是一个单一实体,而是一个丰富的生态系统。

用户空间的组成:

  • 系统库

    • 提供大量预编译好的函数,供应用程序调用,避免重复造轮子。

    • 最核心的库是 GNU C Library,它封装了许多系统调用,提供了更友好、更高级的 API。例如,printf() 函数最终会调用底层的 write() 系统调用。

  • 核心系统工具

    • GNU Coreutils 提供的基本工具,如 ls, cp, mv, cat, grep 等。它们是 Shell 脚本和日常操作的基础。
  • 初始化系统

    • 系统启动后第一个运行的用户空间进程(PID=1),负责启动和管理其他所有用户进程和服务。

    • 例如:传统的 SysVinit,较新的 systemd。

  • 守护进程

    • 在后台运行的系统服务,如 sshd(SSH 服务)、crond(定时任务服务)、httpd(Web 服务)。
  • 桌面环境/应用程序

    • 用户直接交互的图形界面(如 GNOME, KDE)和各种应用程序(如 Firefox, LibreOffice)。

内核与用户的交互:系统调用

用户空间的应用程序如何请求内核提供服务?答案就是系统调用

系统调用是用户程序主动向内核发起请求的唯一合法途径

工作原理

  • 用户程序(如 cat /etc/hosts)调用库函数(如 glibc 中的 open(), read())。

  • 库函数准备好参数,然后执行一条特殊的处理器指令(如 x86 的 int 0x80 或 syscall),触发一个软中断

  • CPU 接收到中断后,切换到特权模式(Ring 0),并跳转到内核中预设的中断处理程序

  • 内核的中断处理程序检查系统调用号和相关参数,确认合法后,执行相应的内核代码(如真正从磁盘读取文件内容)。

  • 内核完成操作后,将结果返回给库函数,并切换回用户模式(Ring 3)。

  • 库函数将结果返回给用户程序。

常见的系统调用:read, write, open, close, fork, execve, kill, brk, socket。

其他交互方式

  • 设备文件/dev 目录下的文件是内核暴露设备的接口。写入 /dev/sda 就是直接写入硬盘(需要权限)。

  • Proc 和 Sys 文件系统:/proc 和 /sys 是内核提供的虚拟文件系统,用于查看和配置内核参数、硬件信息、进程状态等(如 cat /proc/cpuinfo)。

软中断

软中断VS硬中断

特性硬中断软中断
触发源硬件设备(如网卡收到数据包、键盘被按下、磁盘IO完成)软件(内核代码或驱动程序)
时机异步。在任何时候、任何CPU上都可能发生,完全不可预测。异步/半异步。由软件决定何时“标记”一个软中断,但执行时机由内核决定。
紧迫性非常高。需要CPU立即响应,否则可能导致数据丢失(如网卡缓冲区满了)。高,但可延迟。任务很重要,但不要求“立即”执行,可以稍作延迟并批量处理。
执行上下文在中断上下文中执行。不能睡眠、不能调度、不能调用可能阻塞的函数。在软中断上下文中执行。同样不能睡眠、不能调度。
响应行为CPU收到电信号,立即中断当前工作,跳转到硬中断处理程序。内核在某个合适的时机(通常是中断返回前)检查是否有待处理的软中断,并执行它们。

为什么需要软中断?—— “上半部” 和 “下半部”

软中断的设计初衷是为了解决一个关键问题:减少硬中断处理程序的执行时间

硬中断会打断CPU正在执行的任何任务,如果硬中断处理程序过于复杂、耗时过长,会导致系统无法及时响应其他中断,整体性能下降。

为此,Linux内核将中断处理分为两部分:

  • 上半部 - 硬中断处理程序

    • 做什么:做最紧急、最基本的工作。通常是确认中断、简单地读取数据(比如从网卡寄存器中将数据包读到内核的内存缓冲区)和标记一个软中断

    • 要求:执行速度必须非常快,执行完毕后立即退出。

  • 下半部 - 软中断(以及其衍生机制)

    • 做什么:处理所有耗时、不紧急的剩余工作。例如处理数据包、解析协议等繁重任务。

    • 执行时机:在硬中断处理程序返回后,由内核选择一个合适的时机(很快,但不是立即)来执行所有被标记的软中断。

经典比喻:电话铃响

  • 硬中断:电话铃响了。你立即(中断手头工作)跑过去接起电话说“你好,请讲”。—— 这是上半部,快速响应。

  • 软中断:对方开始说一件复杂的事情。你告诉他:“我现在手头有事,5分钟后我给你打回去详细聊。” 然后你挂掉电话,稍后(而不是立即)再打回去进行长时间交谈。—— 这是下半部,处理耗时任务。

通过这种分工,硬中断处理程序变得非常短小精悍,大大减少了系统被中断封锁的时间,提高了系统的响应能力和吞吐量。

软中断工作流程(以网卡接收数据为例)

  • 硬件中断:网卡接收到一个网络数据包,其控制器向CPU的中断引脚发送一个电信号。

  • CPU响应:CPU立即停止当前工作,保存现场,并跳转到网卡驱动注册的硬中断处理函数。

  • 上半部执行

    • 网卡硬中断处理函数确认中断来源。

    • 将网卡缓存区中的数据包拷贝到内核的sk_buff(套接字缓冲区)数据结构中。

    • 标记一个网络接收类型的软中断(NET_RX_SOFTIRQ)。

    • 快速退出硬中断处理函数。

  • 中断返回:CPU准备恢复之前被中断的工作。

  • 执行软中断:在从中断状态返回用户空间之前,内核会检查当前CPU上是否有被标记的待处理软中断。如果有,就开始执行这些软中断的处理函数。

  • 下半部执行

    • 内核执行网络软中断的处理函数。

    • 该函数处理数据包:解析协议(如IP、TCP)、判断该包属于哪个Socket,最后将数据包放入对应应用程序的接收队列。

  • 唤醒进程:如果有一个用户进程正在这个Socket上睡眠等待数据,内核会将其标记为可运行状态。

  • 返回:软中断处理完毕,CPU最终返回到被中断的上下文(可能是用户进程,也可能是另一个内核线程)。

总结:

  • 软中断是一种内核机制:用于延迟执行耗时任务,是对硬中断的补充。

  • 核心目标是提速:通过将中断处理“一分为二”(上半部/下半部),减少硬中断的延迟,提高系统整体性能和响应能力。

  • 执行时机:在硬中断处理程序返回后、内核返回用户空间前执行。

  • 不能睡眠:软中断代码运行在中断上下文中,因此不允许调用可能阻塞或睡眠的函数。

小结

在这里插入图片描述

  • 隔离是核心:内核空间和用户空间的严格隔离是 Linux 稳定性和安全性的基石。

  • 系统调用是桥梁:用户程序通过系统调用这条“合法通道”请求内核服务,无法越权操作。

  • 内核是管理者:它管理着所有硬件资源和最重要的软件资源(进程、内存、文件)。

  • 用户空间是服务对象:它提供了丰富的软件生态,最终服务于用户的需求。


文章转载自:

http://CZdZlEln.rqknq.cn
http://funsYmaT.rqknq.cn
http://XplcIBqL.rqknq.cn
http://1CbDUS5a.rqknq.cn
http://9g0XRede.rqknq.cn
http://D3N0JAwF.rqknq.cn
http://6ApoX2GW.rqknq.cn
http://ALN2T4T9.rqknq.cn
http://D4tHGeIK.rqknq.cn
http://3R7JLfzC.rqknq.cn
http://wUyTfKGg.rqknq.cn
http://4JMsgAdh.rqknq.cn
http://eMaqFg9s.rqknq.cn
http://sCrGyohw.rqknq.cn
http://HS8arRuX.rqknq.cn
http://R1rizz8z.rqknq.cn
http://gjAHY92a.rqknq.cn
http://Jeg28XrS.rqknq.cn
http://fBjTT9US.rqknq.cn
http://uQpyoGhI.rqknq.cn
http://O7yG3iNJ.rqknq.cn
http://ajTMPQTZ.rqknq.cn
http://T4Q4zmSL.rqknq.cn
http://TIzofuG7.rqknq.cn
http://JtXN5ezx.rqknq.cn
http://YwSDPaoj.rqknq.cn
http://ijRcbyuy.rqknq.cn
http://M7EUT4zt.rqknq.cn
http://CqLDkuNj.rqknq.cn
http://7fMCutIn.rqknq.cn
http://www.dtcms.com/a/377097.html

相关文章:

  • Cookie、Session和Token之间的区别
  • 大模型之词嵌入模型实现文本向量化
  • MySQL慢查询
  • 前端如何判断token是否过期
  • 当没有接口文档时,如何使用Jmeter录制和创建脚本
  • 解锁深度学习黑科技:Embedding向量嵌入探秘
  • Java 大视界 -- 基于 Java 的大数据分布式存储在数字图书馆海量资源存储与管理中的应用
  • 6、Python-Pandas数据处理与分析
  • 实现一个优雅的城市选择器组件 - Uniapp实战
  • WebSocket 双向通信实战:SCADA 移动端实时操控响应优化
  • 校园管理系统练习项目源码-前后端分离-【node版】
  • websocket和socket区别
  • Linux驱动如何向应用层提供sysfs操作接口
  • 人工智能学习:Transformer结构中的前馈全连接层
  • 项目需求分析(2)
  • 灌区泵站远程监控物联网网关解决方案
  • 【114B】基于51单片机GSM自动售货机【Keil程序+报告+原理图】
  • 【前言技术拓展Trip one】 芯片自动化和具身智能
  • Windows-Use实战:AI驱动的Windows自动化
  • OpenResty 限流方案对比:lua_shared_dict vs Redis
  • 保安员【单选题】考试题库及答案
  • 为什么90%的前端开发者永远成不了架构师?真相残酷但必须说
  • python如何提取链接中的域名
  • 简单介绍一下Clickhouse及其引擎
  • Qt信号槽机制
  • 【大数据相关】ClickHouse命令行与SQL语法详解
  • 市面上主流接口测试工具对比
  • 【51单片机】【protues仿真】基于51单片机密码锁系统
  • S7-200 SMART 实战:自动包装控制系统的指令应用拆解
  • 【Linux】常用命令汇总