Linux内核物理内存组织结构

一、系统调用sys_mmap

        系统调用mmap用来创建内存映射,把创建内存映射主要的工作委托给do_mmap函数,内核源码文件处理:mm/mmap.c

 二、系统调用sys_munmap

1、vma = find_vma (mm, start); // 根据起始地址找到要删除的第一个虚拟内存区域 vma
2、如果只删除虚拟内存区域 vam 的部分,那么分裂虚拟内存区域 vma
3、根据结束地址找到要删除的最后一个虚拟内存区域 vma
4、如果只删除虚拟内存区域 last 的一部分,那么分裂虚拟内存区域 vma
5、针对所有删除目标,若虚拟内存区域被锁定在内存中(不允许换出到交换区),调用函数解除锁定。
6、调用函数,将所有删除目标从进程虚拟内存区域链表和树中删除,单独组成临时链表。
7、调用函数,针对所有删除目标,在进程页表中删除映射,且从处理器页表缓存中删除映射。
8、调用函数执行处理器架构特定处

三、物理内存组织结构

1.体系结构

目前多处理器系统有两种体系结构:
        1)非一致内存访问(Non-Unit Memory Access,NUMA):指内存被划分成多个内存节点的多处理器系统,访问一个内存节点花费的时间取决于处理器和内存节点的距离。
        2)对称多处理器(Symmetric Multi-Processor,SMP):即一致内存访问(Uniform Memory Access,UMA),所有处理器访问内存花费的时间相同。

示例图如下:

2.内存模型

         内存模型是从处理器角度看到的物理内存分布,内核管理不同内存模型的方式存在差异。内存管理子系统支持 3 种内存模型:
        1)平坦内存(Flat Memory)
        2)不连续内存(Discontiguous Memory)
        3)稀疏内存(Space Memory)

平坦内存(Flat Memory)

  • 结构特点:将系统的物理内存视为一个连续的整体,所有内存地址线性排列,不存在内存分段或区间划分。虚拟地址空间和物理地址空间映射直接,就像一条连续的、没有断点的道路 。
  • 管理方式:简单直接,通常使用一个数组(如 struct page mem_map 数组 )来管理所有内存页,通过简单的地址偏移就能找到对应的物理内存页。
  • 优势
    • 简单高效:内存管理实现不复杂,地址转换简单,系统可直接访问内存,减少地址转换开销 。
    • 易于实现:适用于内存较小、硬件资源有限的架构,在早期计算机系统或一些小型嵌入式系统中应用较多。
  • 劣势:如果物理地址空间存在空洞(如某些地址范围不能被使用),会造成内存浪费,因为要为所有地址创建对应的管理结构 。
  • 举例:早期个人计算机内存容量较小且硬件相对简单,内存模型近似平坦内存模型,操作系统可简单地将内存按顺序划分和管理 ;一些简单的嵌入式设备,如简单的单片机系统,也常采用这种内存模型,因为其内存需求单一、硬件资源有限 。

不连续内存模型(Non-contiguous Memory Model)

        不连续内存模型是一种内存管理方式,内存分配的各个区域不要求在物理内存中连续,进程虚拟内存空间可映射到物理内存中分散、不连续的任意位置。
特点

 
  1. 物理内存不连续:内存无需物理连续,操作系统可将进程虚拟内存映射到物理内存的多个不连续区域。
  2. 内存管理灵活:支持更灵活的内存分配,高效使用内存,减少碎片。
  3. 页面管理:常见实现为分页内存管理,虚拟地址空间和物理内存划分为页面与页框,虚拟页通过页表映射到任意物理页。
    例子
 
  • 分页(Paging):内存划分为固定大小页面(如 4KB),虚拟地址与物理地址通过页表映射,虚拟页可映射到任意物理页,虚拟内存与物理内存不连续。

稀疏内存模型(Sparse Memory Model)

        稀疏内存模型指虚拟内存中部分区域不映射物理内存,甚至完全为空,虚拟内存空间非每块都对应物理地址,呈 “稀疏” 状态。
特点

 
  1. 内存区域稀疏:虚拟内存部分区域无实际物理内存映射,部分虚拟地址不对应物理地址。
  2. 懒加载:操作系统按需分配物理内存,如进程访问无对应物理内存的虚拟地址时,触发缺页异常后再分配内存。
  3. 高效内存使用:允许区域不映射物理内存,在大内存系统中减少不必要分配,提升内存使用效率。
    例子
 
  • 稀疏虚拟内存:操作系统不为大虚拟地址空间(如 64 位系统)全部分配物理内存,Linux 中mmapmprotect系统调用可创建无实际物理内存映射的稀疏区域。

3.三级结构

        内存管理子系统使用节点(node)、区域(zone)、页(page)三级结构描述物理内存。
a、内存节点 —— 分为两种情况:
(1)NUMA 体系的内存节点,根据处理器和内存的距离划分;
(2)在具有不连续内存的 NUMA 系统中,表示比区域级别更高的内存区域,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点。

1.内存节点使用pglist_data结构体描述物理内存布局:(该结构体对应上图中的node)

         node_mem_map 此成员指向页描述符数组,每个物理页对应一个页描述符。
        Node 是内存管理最顶层的结构,在 NUMA 架构下,CPU 平均划分为多个 Node,每个 Node 有自己的内存控制器及内存插槽。CPU 访问自己 Node 上内存速度快,而访问其他 CPU 所关联 Node 的内存速度慢。UMA 被当做只一个 Node 的 NUMA 系统。

2.内存区域(zone)

结构体关系总结:

  • pglist_data 是管理一个 NUMA 节点的结构体,包含该节点所有的 zone
  • zone 代表内存的一个区域,管理着这个区域的页面和空闲页面的链表。
  • zonelist 是一个 zone 的列表,表示多个内存区域的优先级顺序。
  • zoneref 是对某个 zone 的引用,通常在内存分配上下文中使用。
pglist_data(对应内存节点 node)  |  |——> zone(多个 zone 组成内存节点的内存区域,如 ZONE_DMA、ZONE_NORMAL 等)  |       |  |       |——> page(每个物理页面由 struct page 描述符管理)  |  |——> zonelist(独立于 zone 的数据结构,是多个 zone 组成的链表,定义内存分配时 zone 的优先级查找顺序)  |       |  |       |——> zoneref(作为 zonelist 的元素,指向具体 zone,用于在内存分配流程中引用 zone)  

内存分配的流程:
在内核进行内存分配时,通常按以下流程:

  1. 查找可用的 zone:内核先根据 zonelist 顺序查找可用的 zone
  2. 从 zone 获取页面:在选定的 zone 中查找空闲页面,若无空闲页面,可能触发慢路径(如回收页面)。
  3. 返回页面:找到空闲页面后,内核分配页面。

zone包含的内存类型:        

  1. 普通内存(ZONE_NORMAL)
    定义:普通内存区域是指可以直接被内核和用户程序访问的内存,通常涵盖物理内存地址空间中从低端开始的一段连续区域。
    特点:
    1. 访问速度相对较快,因直接映射到内核的线性地址空间。
    2. 适用于大部分内核数据结构和用户进程的数据存储。
    3. 在 32 位系统中,若未启用高端内存(ZONE_HIGHMEM),ZONE_NORMAL 可能占据大部分物理内存。
  2. DMA 区域(ZONE_DMA)
    定义:为满足设备进行 DMA(直接内存访问)操作而保留的内存区域。
    特点:
    1. 位于物理内存的较低地址部分,因一些老式 DMA 控制器只能访问物理内存的低地址区域(如 ISA 总线下的设备)。
    2. 区域大小通常较小,用于存储需通过 DMA 方式传输的数据(如网络数据包、磁盘数据等)。
    3. 确保设备可不经过 CPU 干预直接访问内存,提高数据传输效率。
  3. 高端内存(ZONE_HIGHMEM)
    定义:在 32 位系统中,因内核线性地址空间限制(通常仅 1GB 或 2GB 留给内核,取决于内核配置),物理内存超出内核线性地址空间能直接映射范围的部分。
    特点:
    1. 高端内存不能被内核直接访问,需通过特殊映射机制(如临时映射)访问。
    2. 在 64 位系统中,因线性地址空间充足,高端内存概念可能不再适用或重要性降低。
    3. 主要用于 32 位系统管理超出内核直接映射范围的物理内存。
  4. 可移动内存(ZONE_MOVABLE)
    定义:特殊内存区域,主要用于存放可移动的内存页。
    特点:
    1. 便于内存碎片整理,通过集中放置可移动内存页,整理时更易移动这些页,腾出连续物理内存空间。        
    2. 通常用于用户空间的匿名内存(如堆和栈),这些内存页必要时可移动到其他物理位置。
    3. 这些不同类型内存区域满足不同硬件和软件需求,确保系统高效、稳定运行。

在 Linux 内核中,通常一个内存节点(NUMA node,对应结构体 pglist_data)中的每个内存区域(zone)只会描述一个特定的内存类型(如 ZONE_NORMALZONE_DMAZONE_HIGHMEM 等)。因此,通常情况下,一个内存节点不会有多个相同类型的内存区域(比如两个 ZONE_NORMAL 或两个 ZONE_DMA 区域)。

为什么一个节点中只有一个 ZONE_NORMAL 或 ZONE_DMA

        在内核的内存管理中,内存区域(zone)用于区分不同类型的内存,这些内存类型的访问方式、大小和用途各不相同。例如:

  • ZONE_NORMAL:普通内存区域,用于应用程序内存分配,内核空间和用户空间均可使用。
  • ZONE_DMA:为 DMA(直接内存访问)设备保留的内存区域,这类设备通常只能访问低于特定物理地址的内存,需单独划分区域。
  • ZONE_HIGHMEM:高端内存区域,指超过内核线性地址空间限制的内存,主要用于 32 位系统。

        这些内存区域依内存物理地址范围、用途及硬件限制划分,每个区域有独立物理地址范围限制,因此一个物理内存节点通常只有一个 ZONE_NORMAL、一个 ZONE_DMA 和一个 ZONE_HIGHMEM 区域。

struct pglist_data 和 struct zone 之间的关系

        在 NUMA 架构中,每个内存节点(struct pglist_data)包含多个内存区域(struct zone)。例如,一个内存节点可能包含以下区域:

  • ZONE_NORMAL(普通内存)
  • ZONE_DMA(DMA 内存)
  • ZONE_HIGHMEM(高端内存)

        在此情况下,每个内存节点有一个 ZONE_NORMAL 区域、一个 ZONE_DMA 区域和一个 ZONE_HIGHMEM 区域,这些 zone 相互独立,分别描述不同内存类型。每个 struct zone 表示特定类型的内存区域,而非整个内存节点。

为什么不会有多个相同类型的 zone

内存区域(zone)基于物理内存特性划分,一个物理内存区域只能属于特定类型。例如:

  • ZONE_NORMAL:包含地址空间内大部分可用内存,是应用程序和内核的主要内存区域。
  • ZONE_DMA:针对 DMA 设备划分,包含低于特定物理地址的内存(如低于 1GB 或 4GB,取决于架构和硬件限制)。
  • ZONE_HIGHMEM:为超出内核虚拟地址空间限制的内存保留,常见于 32 位系统。

可能的例外情况

尽管一般情况下,每个内存节点只含一个特定类型的 zone,但以下情况可能导致变化:

  1. 区域类型调整:特定硬件配置或适配可能允许多个物理内存区域被视为一个逻辑区域,取决于硬件支持和内核实现。
  2. 动态调整:内核在内存分配管理中,可能通过区域划分调整、内存回收等机制动态调整或合并内存区域,但不意味着同一节点会有多个相同类型的 zone
  3. NUMA 节点间重叠:复杂硬件平台上,内存节点的物理地址空间可能重叠,导致节点共享内存区域。此时,内核可能处理区域合并或重映射,但每个节点内仍通常只有一个 ZONE_NORMAL、一个 ZONE_DMA 和一个 ZONE_HIGHMEM

3.物理页

        每个物理页对应一个 page 结构体,称为页描述符,内存节点的 pglist_data 实例的成员 node_mem_map 指向该内存节点包含的所有物理页的页描述符组成的数组。Linux 内核源码分析:include/linux/mm_types.h

        页是内存管理当中的最小单位,页面中的内存其物理地址是连续的,每个物理页由 struct page 描述。为了节省内存,struct page 是个联合体。

        页,又称为页帧,在内核当中,内存管理单元 MMU(负责虚拟地址和物理地址转换的硬件)是把物理页 page 作为内存管理的基本单位。体系结构不同,支持的页大小也相同。

        32 位体系结构支持 4kb 的页
        64 位体系结构支持 8kb 的页
        MIPS64 架构体系支持 16kb 的页。

https://github.com/0voice

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

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

相关文章

Mac强制解锁APP或文件夹

当Mac安装过火绒企业版、云安全访问服务之类的APP需要卸载的时候,会发现需要管理员密码,正常的卸载流程走不下去,直接删除APP,会提示“不能完成此操作,xxx已锁定”的信息,此处就记录一下如何关闭锁定状态&a…

Mixed Content: The page at https://xxx was loaded over HTTPS

一、核心原因分析 Mixed Content 警告是由于 HTTPS 页面中引用了 HTTP 协议的资源(如脚本、图片、iframe 等),导致浏览器因安全策略阻止加载这些非加密内容。HTTP 资源可能被中间人攻击篡改,破坏 HTTPS 页面的整体安全性。 二、推荐解决方案 1. 强制资源升级为 HTTPS •…

ARXML文件解析-1

目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 **ARXML文件的结构树**2.3 TAG(XML元素)2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 ADMIN-DATA元素2.4.3 语言相关元素2.4.5 AR-PACKAGE体系结构2.4.6. 数据转换框架2.4.7 S…

[ISP 3A ] AE的常用算法分析

📌 自动曝光(AE, Auto Exposure)解析 自动曝光(AE)是相机通过调节 曝光参数(增益、快门时间、光圈等)来确保拍摄出的图像亮度适宜的算法。AE 需要根据环境光线变化自动调整曝光,以避…

大模型学习二:DeepSeek R1+蒸馏模型组本地部署与调用

一、说明 DeepSeek R1蒸馏模型组是基于DeepSeek-R1模型体系,通过知识蒸馏技术优化形成的系列模型,旨在平衡性能与效率。 1、技术路径与核心能力 基础架构与训练方法‌ ‌DeepSeek-R1-Zero‌:通过强化学习(RL)训练&…

STM32入门学习笔记(持续更新)

b站江协科技资料 通过网盘分享的文件:STM32入门教程资料 链接: https://pan.baidu.com/s/1-rOi83sUK8CqUNsHQuvxew?pwd8krh 提取码: 8krh LED灯闪烁0402 #include "stm32f10x.h" // Device header #include "Delay.h"int m…

企业安全——FIPs

0x00 前言 先来看一道题目。这道题目涉及到的就是道德规范和互联网相关内容,本文会对相关内容进行描述和整理。 正确答案是:D 注意FIPs的主要目的是为了限制,也就是针对数据的守则。 0x01 RFC 1087 1989年1月 互联网架构委员会 IAB 发布了…

【Linux系统编程】进程概念,进程状态

目录 一,操作系统(Operator System) 1-1概念 1-2设计操作系统的目的 1-3核心功能 1-4系统调用和库函数概念 二,进程(Process) 2-1进程概念与基本操作 2-2task_struct结构体内容 2-3查看进程 2-4通…

基于TradingView和CTPBee的自动化期货交易系统实现

引言 在量化交易领域,TradingView因其强大的技术分析工具和丰富的指标库而广受欢迎,但是其不支持国内期货自动化交易,CTPBee则是一个优秀的国产Python期货交易接口。本文将介绍如何将两者结合,实现一个完整的自动化交易系统。 本…

初始ARM

ARM最基础的组成单元。 最小系统:能系统能够正常工作的最少器件构成的系统 。 一、CPU基础定义 ALU(运算单元): 负责执行算术和逻辑运算,是处理器的核心部分。 寄存器(R0, R1, R12)&#xff…

通信数据记录仪-产品概念ID

总结: 1、支持高速CAN、支持容错CAN、支持单线CAN(理解是支持不同的协议,CANFD、CAN2.0和LIN?) 2、 通过上位机设计时间

Qt QTableView QAbstractTableModel实现复选框+代理实现单元格编辑

话不多说&#xff0c;直接看代码 一、Model 1、QTableModel_Test.h #pragma once#include <QAbstractTableModel> #include <QObject> #include <QModelIndex>class QTableModel_Test : public QAbstractTableModel {Q_OBJECT public:QTableModel_Test(Q…

JavaWeb学习--MyBatis-Plus整合SpringBoot的ServiceImpl方法(增加,修改与删除部分)

接下来是常用的增加&#xff0c;修改以及删除部分 首先是增加部分&#xff0c;增加一个新的数据 Testpublic void testInsert() {// 添加一个新用户记录Student s new Student();s.setName("NewStudent");s.setAge(25);boolean saved studentService.save(s);//可以…

明清两朝全方位对比

目录 一、政治制度二、民族与社会三、经济与对外四、文化与思想五、军事与边疆六、灭亡原因总结 明清两朝是中国历史上最后两个封建王朝&#xff0c;在政治、经济、文化等方面存在显著差异&#xff0c;以下为主要区别&#xff1a; 一、政治制度 皇权集中程度 明朝&#xff1a;…

Linux系统时间

1. Linux系统时间 jiffies是linux内核中的一个全局变量&#xff0c;用来记录以内核的节拍时间为单位时间长度的一个数值。 jiffies变量开机时有一个基准值&#xff0c;然后内核每过一个节拍时间jiffies就会加1。 一个时间节拍的时间取决于操作系统的配置&#xff0c;Linux系统一…

高并发系统架构设计的深度解析与实施指南【大模型总结】

以下是对高并发系统架构设计的深度解析与实施指南&#xff0c;通过技术分层拆解和场景化案例说明&#xff0c;呈现完整的系统设计方法论&#xff1a; 一、容错优先思维的系统级实现 1. 混沌工程落地框架 # 混沌实验设计模板 class ChaosExperiment:def __init__(self, scope,…

leetcode-代码随想录-链表-翻转链表

题目 链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]class Solution { public:ListNode* rev…

spring boot 集成redis 中RedisTemplate 、SessionCallback和RedisCallback使用对比详解,最后表格总结

对比详解 1. RedisTemplate 功能&#xff1a;Spring Data Redis的核心模板类&#xff0c;提供对Redis的通用操作&#xff08;如字符串、哈希、列表、集合等&#xff09;。使用场景&#xff1a;常规的Redis增删改查操作。特点&#xff1a; 支持序列化配置&#xff08;如String…

Linux红帽:RHCSA认证知识讲解(九)标准输入输出、重定向、过滤器与管道

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;九&#xff09;标准输入输出、重定向、过滤器与管道 前言一、标准输入与输出、重定向&#xff0c;使用过滤器筛选文件信息1.1 Linux 的标准输入与输出1.2 什么是输入重定向1.3 输出重定向1.4 标准错误输出重定向1.5 使用过滤…

搭建完全分布式系统时,为何必须同步服务器时间?

在构建完全分布式系统时&#xff0c;时间同步是保障系统一致性和可靠性的基石。本文将从完全分布式系统的核心特点、时间同步的必要性、不同步可能引发的灾难性后果、主流时间同步协议对比及最佳实践方案五个角度展开分析&#xff0c;帮助开发者深入理解时间同步的关键作用。 一…