SPARSEMEM带你找到page的老巢

搞懂sparsemem稀疏内存模型 随着大内存和内存热插拔技术发展,内核物理内存越来越不连续,内核管理这种非连续物理内存的元数据metadata也需要随之发展,避免内存浪费,内核的sparse mem稀疏内存模型就是解决该问题。数据结构mmzone.h//根据sec number计算属于哪个root,即mem_section二位数组第一维的index//2048//相当于是[2048][256]的二维数组,每个数组元素是struct mem_section//为了节省空间,这个字段包含很多信息,具体见下面源码的解释/* 阅读详情

今天要来讲讲linux内核中的SPARSEMEM。为什么要讲这个呢? 因为现在的内核默认开启了这个模式。

比如在arch/x86/Kconfig中可以看到如下的配置。

config ARCH_SPARSEMEM_ENABLE
    def_bool y
    depends on X86_64 || NUMA || X86_32 || X86_32_NON_STANDARD
    select SPARSEMEM_STATIC if X86_32
    select SPARSEMEM_VMEMMAP_ENABLE if X86_64

也就是只要是满足depends on这四个条件之一,默认都会开启SPARSEMEM。

你说这个理由实在有点扯淡,那好吧,说个正经点的理由。

书接上回,我们提出了一个思考题:page结构体究竟是存放在哪里?是的,这篇文章和这个问题相关~另外前文那张经典的数据结构关系图中一个未露面的成员zone_mem_map在本文中将会出现。不过我才那张图有点老,出现的可能是他的孙子辈吧。

这个东西说难其实也不难。刚开始理解时略有些麻烦,但是看明白之后也没有太多内容。就让我给你一一道来。

有啥好处?

先来说说用它的好处,否则大家都不知道这是干啥的。在原始补丁中,作者做了些比较详细的描述。我列举一下:

  • 对于有内存空洞的设备,减少系统struct page使用的内存
  • 内存热插拔系统需要使用
  • 在NUMA系统上支持内存的overlap

后两者究竟是怎么用的,暂时还不清楚。减少系统struct page使用的内存,那是肯定的。因为在最原始的实现中,系统struct page是一个超大的静态数组。不管对应的物理地址是否有内存存在,都会有对应的struct page对应。而使用了SPARSEMEM后,只有有效的page才会有对应的struct page存在。

在减少内存使用的同时,也带来了一个问题。

  • pfn_to_page()计算会比原来的慢

针对这点,内核中又引入了SPARSEMEM_VMEMMAP。这个以后再来讲解,这次先关注SPARSEMEM本身。

实现思想

SPARSEMEM提出了一个新的概念

section。

这个section就是比page更大一些的内存区域,但是呢一般意义上又比node的范围要小些。比如在x86_64平台上,这个的大小就是(2^27) = 128M。

整个系统的物理内存就被分成一个个section,并由mem_section结构体表示。

arm64内核内存布局-之vmemmap(page初始化) page地址在VMEMMAP_START 开始。最终的虚拟地址是通过pfn->pa->va。虚拟地址自然是内核之前映射的线性地址区间。vmemmap是内核中page 数据的虚拟地址。针对sparse内存模型。内核申请page获取的page地址从此开始。 阅读详情

相关推荐

基于Arduino与光电传感器的心率监测系统:从原理到实现的完整指南

光电式心率监测是一种基于光电容积脉搏波描记法(PPG)的非侵入式生命体征测量技术。其核心原理是利用特定波长光线照射皮肤组织,通过检测因血液容积周期性变化导致的反射光强微弱波动,来获取心率信息。这项技术的关键价值在于实现了低成本、便携化的连续生理参数监测,广泛应用于健康管理、运动科学及嵌入式系统教学领域。在工程实践中,信号处理算法(如移动平均滤波与动态阈值峰值检测)对提升测量精度至关重要。本文以Arduino平台为例,详细解析了如何集成MAX30102或Pulse Sensor Amped等光电传感器,结合T

weixin_33461476的博客 226

戴文的Linux内核专题:08内核配置(4)

转自Linux中国   这个第四部分里,我们将继续配置更多的设置和特性。 这里我们被问及关于"IBM Calgary IOMMU support (CALGARY_IOMMU)"。这个选项将会提供对IBM xSeries x366和x460的IOMMU的支持。这也将让那些32位PCI的设备工作正常——在这些系统上不支持双地址周期(DAC : Double Address Cycle)——

メ依戀メ伱じ☆ve 1408

Linux内存管理(15):内存模型SPARSEMEM

在《内存架构和内存模型简述》一文中简单描述了处理器中对于内存共享技术的架构 NUMA 和 UMA,以及基于这两个架构衍生的内存模型 FLATMEM、DISCONTIGMEM、SPARSEMEM,其中 FLATMEM 和 DISCONTIGMEM 因为各自的缺点而被放弃,SPARSEMEM是Linux 中最多用途的内存模型,也是唯一一个支持多种高级features 的内存模型,例如物理内存的 hot-plug 和 hot-remove、非易失性内存设备的替代内存映射、延迟大型系统内存映射的初始化。在。

私房菜 1553

内核解读之内存管理(5)内存模型

还是用于进程的页表?如果物理内存空间是一个连续的,没有空洞的地址空间,那么这种计算机系统的内存模型就是Flat memory,如图所示,我们将内存分成一页一页的Page frame,描述page frame的结构体page组成一个数组mem_map,通过将地址转换成页帧号(即该地址对应的pagepage数组中的索引)可以取得该地址对应的page,就可以访问任何一页物理内存。如果是极致sparse内存模式,用一个page的大小来存放一个root的所有mem_section,也就是一个root有。

二进制君 1998

linux 内存管理 图解,Linux内存管理中的SPARSEMEM

今天要来讲讲linux内核中的SPARSEMEM。为什么要讲这个呢? 因为现在的内核默认开启了这个模式。比如在arch/x86/Kconfig中可以看到如下的配置。config ARCH_SPARSEMEM_ENABLEdef_bool ydepends on X86_64 || NUMA || X86_32 || X86_32_NON_STANDARDselect SPARSEMEM_STATI...

weixin_42514970的博客 547

内存管理

linux内存管理

RichardYSteven的专栏 970

从pfn_to_page/page_to_pfn看linux SPARSEMEM内存模型

本文以arm64架构为背景。一 背景计算机中的物理内存本来是没有没有页/page的概念的,Linux为了各种冠冕堂皇的理由,硬生生的将计算机中的物理内存以page为单位划分成一个一个的小方块,称作页框,每个页框有一个编号叫做PFN;有了PFN,就能够计算出这个页框对应的物理地址,有了物理地址CPU就能够通过总线访问到对应的内存。

mabin2005的专栏 1162

Linux 内存模型(Memory: the flat, the discontiguous, and the sparse)

Linux 内存模型(Memory: the flat, the discontiguous, and the sparse)简单描述

小立仔 1690

linux中 struct page 与物理地址的关系

以sparse模型为例,每个numa node 有自己的物理地址。在初始化时(sparse_init_nid)会将可用内存按section(比例32k个页)大小分成若干section,在大于dma区的内存中为他分配一个memmap,这个memmap 是struct page的集合。

qq_37517281的博客 1129

Linux内存初始化之sparse内存模型(二)

1.Linux内存模型 前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析sparse内存模型 在linux内核中支持3中内存模型,分别是flat memory model,Discontiguous memory model和sparse memory model。所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux k...

bin_linux96的专栏 2904

稀疏型内存模型中section_mem_map的初始化

在 linux 中,稀疏型内存模型意味着物理地址空间由若干个地址段组成,段与段之间允许存在空洞,适用于地址段比较稀疏的情况,并用于支持内存热插拔。 稀疏型内存模型将整个物理地址空间划分成多个区段(section)。一个区段用一个 struct mem_section 结构体来描述,其中最重要的字段是 section_mem_map,它编码了 NUMA 节点号、页描述符数组的地址以及一些标志位。 struct mem_section 数组声明: /* * Permanent SPARSEMEM data

choumin的专栏 1354

linux内存模型

前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析内存模型。在Linux内核中支持3种内存模型,分别为 flat memory model Discontiguous memory model sparse memory model 所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理内存。某些体系架构支持多种内存模型,但在内核编译构建时只能选择使用一种内存模型。 1. 基本概念 1.

生活需要深度 2543

深入分析Linux内核源代码6-Linux 内存管理(2)

每天十五分钟,熟读一个技术点,水滴石穿,一切只为渴望更优秀的你! ————零声学院 6.3 内存的分配和回收 在内存初始化完成以后,内存中就常驻有内核映像(内核代码和数据)。以后,随着用 户程序的执行和结束,就需要不断地分配和释放物理页面。内核应该为分配一组连续的页面 而建立一种稳定、高效的分配策略。为此,必须解决一个比较重要的内存管理问题,即外碎 片问题。频繁地请求和释放不同大小的一组连续页面,必然导致在已分配的内存块中分散许 多小块的空闲页面。由此来的问题是,即使这些小块的空闲页面加起来足以满足所请求

资料qun832218493 567

linux内存管理笔记(十七)----linux内存模型

前面已经分析把物理内存添加到memblock以及给物理内存建立页表映射,这里我们分析sparse内存模型。在Linux内核中支持3种内存模型,分别为 flat memory model Discontiguous memory model sparse memory model 所谓memory model,其实就是从cpu的角度看,其物理内存的分布情况,在linux kernel中,使用什么的方式来管理这些物理内存。某些体系架构支持多种内存模型,但在内核编译构建时只能选择使用一种内存模型。 1. 基

奇小葩 3350

linux kernel struct 之 mem_section

linux kernel struct 之 mem_section

xiaozhi 279

简单说一linux内核的内存模型(平坦,不连续,稀疏等三种内存模型)

目录Linux内核支持的三种内存模型CONFIG_FLATMEM(平坦内存模型)基本概念(以第一个为例,不在复述)所以说什么是平坦模型所以说什么是不连续模型 Linux内核支持的三种内存模型 CONFIG_FLATMEM(平坦内存模型) CONFIG_DISCONTIGMEM(不连续内存模型) CONFIG_SPARSEMEM_VMEMMAP(稀疏的内存模型) CONFIG_FLATMEM(平坦内存模型) 基本概念(以第一个为例,不在复述) 就像管理一个学校,我们一般不以个人为单位,而是选择以班级为单位进

KUNPLAYBOY的博客 3482

内存管理(七):物理内存组织

1 体系结构 目前多处理器系统有两种体系结构 1、对称多处理器(Symmetric Muti-Processsor,SMP):即一致内存访问(UMA),UMA系统有以下特点 所有硬件资源都是共享的,每个处理器都能访问到系统中的内存和外设资源 所有处理器都是平等关系 统一寻主访问内存 处理器和内存通过内部的一条总线连接在一起。 2 非一致性内存访问(Non-Uniform Memory Access, NUMA):内存被划分为多个内存节点,访问一个内存节点花费的时间取决于处理器和内存节点的距离,每个处理器

进步源于记录,优秀来自分享 1349

setup_arch:bootmem_init : sparse_init

首先简单说明一下背景知识,启动阶段的内存模型一般有4种:FLATMEM,经典sparse和sparse vmemmap,以及zone devie FLATMEM 这种模型适用于具有连续物理内存或大部分连续物理内存的非NUMA系统。 在FLATMEM内存模型中,有一个全局mem_map数组映射整个物理内存。对于即使是空洞的物理内存,也需要分配struct page结构体,只不过不会被初始化,映射到具体的物理内存。因此使用的时候要通过pfn_valid来进行检测,可以看到这样实际是浪费了一些struct pa

HZero 1171

Linux sparsemem/mem_section:从地址网格到 struct page 的完整心智模型 -- 笔记版

第一层:mem_section 网格整个物理地址空间被均匀划分为一个个网格(mem_section)。每个网格编号为i,负责。第二层:section_mem_map 账本每个**存在内存的网格(present section)**拥有一本“账本”(),账本的每一页是一个,对应网格里的一个 PFN。账本是连续页码 0 ~,可以通过简单算术找到某一页。第三层:page 标志位真实内存页:账本该页记录为“可用”,会被加入伙伴系统。内存空洞页:账本该页记录为“保留/无效”(例如),不会参与分配。

glgwyn的专栏 505

Labview机器学习工具包及例程_Iabview神经网络工具包,labview中的机器学习工具包

除机器学习安装工具包外,里面还有包含了多种机器学习算法里,如BP神经网络、SVM、SOM等。希望可以帮助到大家

上一篇: make中:=和=的区别
下一篇: Node->Zone->Page
RichardYSteven
博客等级 码龄19年 297粉丝 513原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值