Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

引言

如果说操作系统是计算机的心脏,那么内存管理就是它的灵魂脉络。它默默地工作在Linux内核的最底层,却决定着整个系统的稳定性、安全性和性能。今天,我们将拨开迷雾,深入探索Linux内存管理的核心概念,并结合熟悉的ARM32架构,看看这些理论是如何在具体芯片上实践的。

一、 内存管理在内核中的位置和作用

想象一下,如果没有操作系统,多个应用程序同时运行会怎样?它们可能会争抢同一块内存地址,导致数据互相覆盖,最终系统崩溃。

Linux内核的内存管理(Memory Management, MM)子系统就是为了解决这些问题而存在的,它是内核中最复杂、最核心的子系统之一。

它的核心作用可以概括为:

  1. 抽象与虚拟化:为所有进程提供一套统一的、独立的虚拟地址空间,让每个进程都“自以为”独享整个内存资源。这是内存管理的基石。
  2. 分配与回收:高效地响应内核和应用程序的内存申请请求(如mallockmalloc),并在适当的时候回收闲置内存。
  3. 隔离与保护:严格隔离内核空间与用户空间,隔离不同用户进程的空间。一个进程的崩溃不会影响整个系统或其他进程,极大地提升了系统稳定性。
  4. 优化与扩展:利用磁盘空间作为辅助(Swap),让进程可以使用比实际物理内存更大的地址空间;并通过缓存(Cache)等技术来提升访问速度。

可以说,内存管理是内核资源的“大管家”,负责所有资源的分配、调度和保护。

二、 物理内存 vs 虚拟内存

这是理解内存管理的第一道门槛。

物理内存(Physical Memory)
  • 是什么:这就是我们插在开发板或手机主板上的实际RAM芯片。例如ARM开发板上常见的512MB DDR RAM。
  • 特点
    • 地址是连续唯一的物理地址。CPU通过地址总线直接访问。
    • 容量有限,且被所有进程和内核共享。
    • 直接管理物理内存非常困难,容易出现碎片化和冲突。
虚拟内存(Virtual Memory)
  • 是什么:它是一个抽象层,是Linux内核为每个进程提供的一个“幻象”。每个进程都认为自己独享一块从0开始的、连续的、巨大的(如3GB)内存空间。
  • 特点
    • 地址是虚拟地址,由进程使用。CPU在执行指令时使用的都是虚拟地址。
    • MMU(内存管理单元):这是硬件核心!ARM处理器内部的MMU负责在运行时将虚拟地址动态翻译为物理地址。
    • 页表(Page Table):翻译所依赖的“地图”,由内核维护,存储在内存中。它记录了虚拟页到物理页帧的映射关系。

它们之间的关系
虚拟内存就像是一本厚厚的作业本(虚拟地址空间),而物理内存是你手边所有的草稿纸(物理内存)。你做作业时(进程运行),只需要关注作业本上的题目和页码(虚拟地址)。你的大脑(MMU)会根据需要,随时把作业本上的内容安排到某张草稿纸(物理地址)上进行运算,这个过程对你来说是透明的。内核则是课代表,负责分配和回收草稿纸(管理页表)。

三、 ARM32内核空间 vs 用户空间内存布局

在Linux中,每个进程的4GB虚拟地址空间(32位系统)会被严格地划分为两部分:用户空间内核空间。ARM32架构采用了一种经典的划分方式:3:1分割

这意味着:

  • 0~3GB(0x0000 0000 ~ 0xBFFF FFFF):分配给用户空间
  • 3GB~4GB(0xC000 0000 ~ 0xFFFF FFFF):分配给内核空间

让我们结合ARM32来看一张经典的布局图:

+----------------------+ 0xFFFF FFFF (4GB)
|     内核空间         |
|   - 内核镜像         |    | 所有进程**共享**同一份内核空间映射
|   - 物理内存映射     |    | 运行在高端地址,具有最高权限(ARM的SVC模式)
|   - 内核栈           |    | 用户进程无法直接访问,否则会触发段错误
|   - 设备寄存器映射   |    |
+----------------------+ 0xC000 0000 (3GB)
|                      |
|     用户空间         |    | 每个进程**独有**一份
|   - 代码段 (.text)   |    | 运行在低端地址,权限受限(ARM的USR模式)
|   - 数据段 (.data)   |    |
|   - BSS段 (.bss)     |    |
|   - 堆 (Heap)        |    | 向上增长 (malloc)
|   - ...              |    |
|   - 内存映射段       |    | 加载动态库、文件映射
|   - 栈 (Stack)       |    | 向下增长 (局部变量)
|   - 环境变量/参数    |    |
+----------------------+ 0x0000 0000
为什么这样设计?
  1. 特权级与安全

    • ARM处理器有不同模式(USR, SVC, IRQ等)。用户代码运行在USR模式,权限最低,无法直接执行特权指令或访问硬件。
    • 内核代码运行在SVC模式,拥有最高权限。
    • 当用户程序需要请求内核服务(如分配内存、读写文件)时,必须通过系统调用(如swi指令或svc指令)陷入内核。此时CPU会切换到SVC模式,并跳转到内核空间的高地址端执行相应代码。这个过程伴随着地址空间的切换,但内核空间的部分始终存在。
  2. 效率

    • 内核空间被所有进程共享。这意味着内核的代码和数据(如驱动、数据结构)只需要在物理内存中存在一份,就可以被所有进程使用,极大地节省了内存。
    • 进程切换时(上下文切换),只需要切换用户空间的页表,内核空间的页表保持不变,效率很高。
ARM32的特殊考量

在ARM32上,物理内存到内核空间的线性映射通常从0xC000 0000开始。例如,物理地址0x1000 0000对应的内核虚拟地址可能就是0xC100 0000。这种固定偏移的映射方式使得内核访问物理内存非常高效。

总结

Linux内存管理是一个庞大而精妙的系统。我们总结了三个核心点:

  1. 内存管理是内核的基石,负责抽象、分配、隔离和优化内存资源。
  2. 虚拟内存是提供给进程的“幻象”,通过MMU和页表将其映射到宝贵的物理内存上,这是多任务管理的基石。
  3. 在ARM32上,采用3:1的地址空间划分,通过硬件特权级和系统调用机制,严格且高效地隔离了用户态和内核态,保障了系统的安全与稳定。

理解这些基础概念,是后续学习分页机制、内存分配器(Buddy, Slab)、换页机制等更深入话题的关键。希望这篇博客能为你打开Linux内存管理的大门!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能

好的,我将根据【国际化与格式化】和【内存管理与性能】这两个主题,为你生成详细的课件内容,涵盖概念、应用和实例。 📗 前端开发核心:国际化与格式化、内存管理与性能 1. 国际化与格式化 (Internationalization & …

3D 可视化数字孪生运维管理平台:构建 “虚实协同” 的智慧运维新范式

3D 可视化数字孪生运维管理平台通过 “物理空间数字化建模 实时数据动态映射 智能分析决策”,将建筑、园区、工业设施等物理实体 1:1 复刻为虚拟孪生体,打破传统运维 “信息割裂、依赖经验、响应滞后” 的痛点,实现从 “被动抢修” 到 “主…

DP-观察者模式代码详解

观察者模式: 定义一系列对象之间的一对多关系;当一个对象改变状态,它的依赖都会被通知。 主要由主题(Subject)和观察者(Observer)组成。 代码实现 package com.designpatterns.observer;/*** 定…

1983:ARPANET向互联网的转变

一、ARPANET早期1969年诞生的ARPANET最初还算不上互联网,不过在ARPANET构建之初就已经考虑了分组交换:1970年代的ARPANET:其实这个时候我就有疑问,TCP/IP是1983年1月1日更新到ARPANET的,但是1970年代的ARPANET已经连接全美的重要单…

自动化运维-ansible中的变量运用

自动化运维-ansible中的变量运用 一、变量命名规则 组成:字母、数字、下划线。必须以字母开头。 合法: app_port, web_1, varA非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头) 避免使用内置关键字:例如 hosts, tasks, name…

深入学习并发编程中的volatile

volatile 的作用 保证变量的内存可见性禁止指令重排序1.保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,其它线程每次使用前立即从主内存刷新。 但普通变量做不到这点,普通…

使用Java获取本地PDF文件并解析数据

获取本地文件夹下的PDF文件要获取本地文件夹下的PDF文件,可以使用Java的File类和FilenameFilter接口。以下是一个示例代码片段:import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吴恩达机器学习补充:决策树和随机森林

数据集:通过网盘分享的文件:sonar-all-data.csv 链接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取码: 12gr 学习来源:https://github.com/cabin-w/MLBeginnerHub 文末有完整代码,由于这里的代码和之前的按…

Shell脚本一键监控平台到期时间并钉钉告警推送指定人

1. 监控需求客户侧有很多平台需要定期授权,授权后管理后台才可正常登录,为避免授权到期,现撰写脚本自动化监控平台授权到期时间,在到期前15天钉钉或其他媒介提醒。2. 监控方案2.1 收集平台信息梳理需要监控的平台地址信息&#xf…

华为HCIE数通含金量所剩无几?考试难度加大?

最近网上很火的一个梗——法拉利老了还是法拉利,这句话套在华为HCIE数通身上同样适用,华为认证中的华为数通和云计算两大巨头充斥着大家的视野里面,也更加广为人知,但随着时代的发展,华为认证体系的调整,大…

#数据结构----2.1线性表

在数据结构的学习中,线性表是最基础、最核心的结构之一 —— 它是后续栈、队列、链表等复杂结构的 “基石”。今天从 “是什么”(定义)到 “怎么用”(基本操作),彻底搞懂线性表的核心逻辑。 一、先明确&…

2508C++,skia动画

gif动画原理 先了解一下gif动画的原理: gif动画由一系列静态图像(或叫帧)组成.这些图像按特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的. 每两帧之间有指定的时间间隔(一般小于60毫秒),gif播放器每渲染一帧静态图像后,即等待此时间间隔,依此逻辑不断循环渲染…

AI + 机器人:当大语言模型赋予机械 “思考能力”,未来工厂将迎来怎样变革?

一、引言1.1 未来工厂变革背景与趋势在科技飞速发展的当下,全球制造业正站在变革的十字路口。随着消费者需求日益多样化、市场竞争愈发激烈,传统工厂模式的弊端逐渐显现。生产效率低下、难以适应个性化定制需求、设备维护成本高昂且缺乏前瞻性等问题&…

pinia状态管理的作用和意义

1. 什么是状态管理 状态管理就是统一管理应用中的数据,让数据在多个组件之间共享和同步。 // 没有状态管理 - 数据分散在各个组件中 // 组件A const user ref({ name: 张三, age: 25 })// 组件B const user ref({ name: 张三, age: 25 }) // 重复定义// 组件C c…

十四、STM32-----低功耗

一、电源框图VDDA 供电区域,主要是 ADC 电源以及参考电压,STM32 的 ADC 模块配备独立的供电方 式,使用了 VDDA 引脚作为输入,使用 VSSA 引脚作为独立地连接,VREF 引脚为提供给 ADC 的 参考电压。电压调节器是 STM32 的…

一篇文章带你彻底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 内存管理的执行引擎,负责自动回收无用的对象内存。其设计核心是 权衡:主要是吞吐量和停顿时间之间的权衡。没有“最好”的收集器,只有“最适合”特定场景的收集器。一、核心基础:分代收集模型主流 HotSpot JVM 采…

服务器排故随笔:服务器无法ssh远程登录

文章目录服务器排故随笔:服务器无法远程登录问题现象解决过程第一步:确认故障描述是否准确第二步:确认网络是否有问题第三步:确认ssh服务是否有问题第四步:确认防火墙是否放行sshd服务第五步:试试万能的“重…

Deeplizard深度学习课程(六)—— 结合Tensorboard进行结果分析

前言 Tensorboard最初是tensorflow的可视化工具,被用于机器学习实验的可视化,后来也适配了pytorch。Tensorboard是一个前端web界面,,能够从文件里面读取数据并展示它(比如损失、准确率、网络图)。具体使用可…

C语言————实战项目“扫雷游戏”(完整代码)

无论是找工作面试,还是课设大作业、考研,都离不开实战项目的积累,如果你能把一个项目搞明白,并且给别人熟练的讲出来,即使你没有过项目经历,也可以说是非常加分的,下面来沉浸式体验一下这款扫雷…

数据结构之加餐篇 -顺序表和链表加餐

目录一、链表分割二、随机链表的复制总结一、链表分割 链表分割 题目描述的意思就如下图: 也就是把1,2挪到前面,6,3,5挪到后面,前者的相对顺序不发生改变 这里要想往后挪就要先遍历,遍历到6…