0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux中内存管理子系统开发必知的3个结构概念

Dp1040 来源:嵌入式Linux充电站 2023-08-28 09:34 次阅读

Linux中内存管理子系统使用节点(node)、区域(zone)和页(page)三级结构描述物理内存。

1、内存节点

内存节点分两种情况:UMA和NUMA。

从管理内存的方法上区分,计算机可以分为两种类型:UMA和NUMA。

UMA:一致性内存访问,uniform memory access

NUMA:非一致性内存访问,non-uniform memory access

两种类型示意图:

de887aa4-453a-11ee-a2ef-92fbcf53809c.png

对UMA来说,每一个CPU访问的都是同一块内存,因此各CPU对内存的访问不存在性能差异。

对NUMA来说,各内存和各CPU通过总线连在一起,每个CPU都有一个本地内存,访问速度快,CPU也可以访问其他CPU的本地内存,但速度稍慢。

Linux为了统一这两种平台,在内存组织中,将最高层次定义为内存节点

可以看到,图中UMA只有一个内存节点,而NUMA有两个内存节点。

实际上,UMA其实是NUMA的一个特例,所以内核可以将内存都看做NUMA类型的。

2、区域

每个内存节点都划分为多个区,Linux内核中定义了以下几个区:

include/linux/mmzone.h

enum zone_type{
#ifdef CONFIG_ZONE_DMA
ZONE_DMA,
#endif
#ifdefi CONFIG_ZONE_DMA32
ZONE_DMA32,
#endif
ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM
ZONE_HIGHMEM,
#endif
ZONE_MOVABLE,
#ifdef CONFIG_ZONE_DEVICE
ZONE_DEVICE,
#endif
__MAX_NR_ZONES
};

ZONE_DMA

DMA是“Direct Memory Access”的缩写,直接内存访问。

该区域用于ISA设备的DMA操作,范围是0-16MB。

如果有些设备不能直接访问所有内存,则需要使用DMA区域。例如旧的工业标准体系结构(Industry Standard Architecture, ISA)总线只能直接访问16MB以下的内存。

只适用于Intel x86架构,ARM架构没有这个内存管理区。

ZONE_DMA32

在64位的系统上使用32位地址寻址的适合DMA操作的内存区。

例如在AMD64系统上,该区域为低4GB的空间。在32位系统上,本区域通常是空的。

ZONE_NORMAL

常规内存区,指的是可以直接映射到内核空间的内存。

也常称为“普通区域”“直接映射区域”“线性映射区域”。

所谓线性映射就是物理地址和映射后的虚拟地址存在一种简单的关系,即虚拟地址=物理地址+固定偏移。

在32位系统上,内核空间和用户空间按1:3划分,那么这个固定偏移就是:0xC0000000 - 物理内存起始地址。

既然存在一种线性关系,那还需要使用页表对物理地址和虚拟地址做映射吗?

不同处理器架构实现不一样,ARM需要使用页表映射,MIPS则不需要。

ZONE_HIGHMEM

高端内存区,32位时代的产物。在32位系统上,指的是高于896M的物理内存。

32位系统中,内核和用户地址空间按1:3划分,内核地址空间只有1GB,所以不能把1GB以上的内存直接映射到内核地址空间,因此就把不能直接映射的内存划分到了高端内存区。

要将高于896MB的物理内存映射在内核空间的话,需要通过单独的映射来完成,并且这类映射不能保证物理地址和虚拟地址之间存在固定的对应关系(例如ZONE_NORMAL的固定偏移)。

ZONE_DMA、ZONE_DMA32、ZONE_NORMAL通常都统称为低端内存区。

64位系统中没有这个区域,即没有高端内存。因为64系统的内核虚拟地址空间非常大,不再需要高端内存区域。

ZONE_MOVABLE

一个伪内存区,用来防止内存碎片。

ZONE_DEVICE

为支持持久内存(persistent memory)热拔插增加的内存区域。

3、页

站在处理器的角度来看,管理物理内存的最小单位是页面。

现在的处理器都采用分页机制来管理内存,在处理器内部有一个MMU硬件,它会处理虚拟内存到物理内存的映射,也就是做页表的翻译工作。

Linux内核中使用一个page数据结构来描述一个物理页面。

页的大小通常是4KB,但有个的架构的处理器可以支持大于4KB的页,例如8KB、16KB或者64KB的页。

目前Linux内核默认使用4KB的页面。

所以,Linux内核的用三级结构来管理物理内存,简言之就是内存首先划分成若干个大的节点,每个节点又包含若干个区,每个区有包含若干页。Linux内核按页管理内存,最基本的内存分配和释放都是按页进行的。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222157
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99020
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • UMA
    UMA
    +关注

    关注

    0

    文章

    4

    浏览量

    6471
  • 虚拟内存
    +关注

    关注

    0

    文章

    70

    浏览量

    8018

原文标题:底层开发必知的3个内存结构概念

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内核的物理内存组织结构详解

    Linux内存管理子系统使用 节点(node)、区域(zone)和页(page) 三级结构描述物理内存
    发表于 08-21 15:35 245次阅读
    <b class='flag-5'>Linux</b>内核的物理<b class='flag-5'>内存</b>组织<b class='flag-5'>结构</b>详解

    ARM LINUX系统开发

    会讲到为什么我认为这样会比较有意思!2. LINUX预备知识作为一LINUX嵌入式系统开发人员,初步熟悉LINUX操作
    发表于 12-02 19:39

    嵌入式linux内核的五个子系统

    嵌入式linux内核的五个子系统分享到: Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件
    发表于 09-10 14:09

    嵌入式Linux系统开发学习步骤

    和步骤。今天,笔者和大家分享一很不错的关于嵌入式Linux系统开发学习步骤,希望对大家有所帮助。 一:嵌入式c语言  C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言
    发表于 08-25 15:38

    嵌入式Linux系统开发学习路线

    Linux基础  Linux操作系统概念、安装方法,详细了解Linux下的目录结构、基本命令
    发表于 09-21 10:09

    嵌入式Linux系统开发技术详解--基于ARM(完整版)

    的基础知识,但是多数大学毕业生不清楚到底该如何开发嵌入式 Linux 系统。编写本书的目的就是阐述嵌入式 Linux 系统的各组成部分,从
    发表于 02-25 20:47

    嵌入式Linux系统开发学习步骤

    和步骤。今天,笔者和大家分享一很不错的关于嵌入式Linux系统开发学习步骤,希望对大家有所帮助。技术交流可以加QQ啊2685896890  一:嵌入式c语言  C语言是嵌入式领域最重要也是最主要的编程
    发表于 06-18 10:31

    嵌入式Linux系统开发学习步骤

    。其实针对这类的问题主要还是因为大家对自己的学习没有一清晰的学习规划和步骤。今天,笔者和大家分享一很不错的关于嵌入式Linux系统开发学习步骤,希望对大家有所帮助。 一:嵌入式c语
    发表于 08-13 16:04

    管理信息系统开发

    的要求不是很高,市场上常用的系统软件足可以满足系统开发的需要。同时,开发人员具有开发复杂管理信息系统的丰富经验,在
    发表于 10-09 17:38

    ARM嵌入式Linux系统开发详解

    建立和第一Linux应用程序;第2篇介绍了Linux应用程序编程基础、开发多进程/线程程序、网络通信应用、串行口通信编程、嵌入式GUI程序开发
    发表于 09-14 08:57

    初学者嵌入式linux系统的学习步骤

    嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cr
    发表于 01-18 10:34

    Linux内核结构详解

    Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。1.进程调度(SCHED):控制进程对CPU的访
    发表于 07-11 16:59

    【HarmonyOS】HarmonyOS子系统开发指导

    子系统开发主要从三方面进行指导,分别是图形图像类子系统开发指导,相机子系统开发指导和音视频子系统开发指导。图形图像容器类组件
    发表于 09-21 14:50

    解答大家在Linux系统开发

    期高手问答老师将为我们解答大家在Linux系统开发,单片机开发,以及在进行开发鸿蒙PCB开发
    发表于 10-01 00:22

    Linux虚拟内存管理技术的相关资料分享

    嵌入式系统开发嵌入式系统开发工具进程控制Linux虚拟内存管理技术嵌入式系统开发工具进程控制1、
    发表于 12-22 06:33