Linux内存管理 | 四、物理地址空间设计模型

这篇具有很好参考价值的文章主要介绍了Linux内存管理 | 四、物理地址空间设计模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发
我的圈子: 高级工程师聚集地
我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业!
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

前面几篇文章,主要讲解了虚拟内存空间的布局和管理,下面同步来聊聊物理内存空间的布局和管理。

顺便介绍一下 我的圈子:高级工程师聚集地,期待大家的加入。

1、物理内存

什么是物理内存?

我们平时聊的内存,也叫随机访问存储器(random-access memory),也叫RAM

RAM分为两类:

  • SRAM:静态RAM,其主要用于CPU高速缓存 L1CacheL2CacheL3Cache,其特点是访问速度快,访问速度为 1 - 30 个时钟周期,但是容量小,造价高。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

  • DRAM:动态RAM,其主要用于我们常说的主存上,其特点的是访问速度慢(相对高速缓存),访问速度为 50 - 200 个时钟周期,但是容量大,造价便宜些(相对高速缓存)。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

DRAM经过组合起来,就作为我们的计算机内存,也是物理内存。

 

2、物理内存访问模型

上面介绍了物理内存的基本组成,那么CPU是如何访问物理内存的呢?

对于CPU访问物理内存,Linux提供了两种架构:UMA(Uniform Memory Access)一致内存访问,NUMA(Non-Uniform Memory Access)非一致内存访问。

2.1 UMA

UMA架构下,多核处理器中的多个CPU,位于总线的一侧,所有的内存条组成的物理内存位于总线的另一侧。

所有的CPU访问内存都要经过总线,并且距离都是一样的,所以在UMA架构下,所有CPU具有相同的访问特性,即对内存的访问具有相同的速度。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

2.2 NUMA

这种架构,系统中的各个处理器都有本地内存,处理器与处理器之间也通过总线连接,以便于其他处理器对本地内存的访问。

UMA不同的是,处理器访问本地内存的速度要快于对其他处理器本地内存的访问。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

3、物理内存组织模型

内存页是物理内存管理中最小单位,有时也成为页帧(Page Frame)

内核对物理内存划分为一页一页的连续的内存块,每页大小4KB,并且使用struct page结构体来表示页结构,其中封装了每个页的状态信息,包括:组织结构,使用信息,统计信息等。

page结构体较为复杂,我们后续再深入了解。

 

3.1 FLATMEM平坦内存模型

FLATMEM即:flat memory model

我们把物理内存想象成它是由连续的一页一页的块组成的,我们从0开始对物理页编号,这样每个物理页都会有页号。

由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在哪一页。

如果是这样,整个物理内存的布局就非常简单、易管理,这就是最经典的平坦内存模型(Flat Memory Model)

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

如上图,平坦内存模型中,内核使用一个mem_map的全局数组,来组织所有划分出来的物理内存页,下标由PFN表示。

在平坦内存模型下 ,page_to_pfnpfn_to_page 的计算逻辑就非常简单,本质就是基于 mem_map 数组进行偏移操作。

#ifndef ARCH_PFN_OFFSET
#define ARCH_PFN_OFFSET		(0UL)
#endif

#if defined(CONFIG_FLATMEM)
#define __pfn_to_page(pfn) (mem_map + ((pfn)-ARCH_PFN_OFFSET))
#define __page_to_pfn(page) ((unsigned long)((page)-mem_map) + ARCH_PFN_OFFSET)
#endif

ARCH_PFN_OFFSETPFN 的起始偏移量。

 

3.2 DISCONTIGMEM 不连续内存模型

DISCONTIGMEM即:discontiguous memory model

我们早期内核使用的是FLATMEM模型,该模型对于较小的,连续的物理空间是方便使用的,但是当物理内存不连续时,使用mem_map管理,就会出现空洞,这会浪费mem_map数组本身占用的内存空间。

对于NUMA访问内存模型,物理内存分布就是不连续的,为了有效管理,DISCONTIGMEM 不连续内存模型出现了。

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

在不连续的物理内存中,DISCONTIGMEM不连续内存模型,将物理内存分成了一个个的node,然后每个node管理一块连续的物理内存,连续的物理内存仍然使用FLATMEM平坦内存模型来管理,从而避免了内存空洞的浪费。

我们可以看出 DISCONTIGMEM 非连续内存模型其实就是 FLATMEM 平坦内存模型的一种扩展。

DISCONTIGMEM是个稍纵即逝的内存模型,在SPARSEMEM出现后即被完全替代

 

3.3 SPARSEMEM稀疏内存模型

随着内存技术的发展,内核可以支持物理内存的热插拔了(像我们的内存条,可以直接插入拔出),这样不连续物理内存已然称为常态。

SPARSEMEM稀疏内存模型的核心思想就是对粒度更小的连续内存块进行精细的管理,用于管理连续内存块的单元被称作 section

物理页大小为 4k 的情况下, section 的大小为 128M ,物理页大小为 16k 的情况下, section 的大小为 512M

 

在内核中,使用struct mem_section结构体表示SPARSEMEM模型中的section

struct mem_section {
	unsigned long section_mem_map;
        ...
}
  • 每个mem_section管理一片小的,物理内存连续的区域,并且支持对该区域的offline/online状态

  • 所有的mem_section都保存在一个全局数组中

整体的框架如下:

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发

SPARSEMEM 稀疏内存模型下 page_to_pfnpfn_to_page 的计算逻辑又发生了变化。

#if defined(CONFIG_SPARSEMEM)
/*
 * Note: section's mem_map is encoded to reflect its start_pfn.
 * section[i].section_mem_map == mem_map's address - start_pfn;
 */
#define __page_to_pfn(pg)					\
({	const struct page *__pg = (pg);				\
	int __sec = page_to_section(__pg);			\
	(unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec)));	\
})

#define __pfn_to_page(pfn)				\
({	unsigned long __pfn = (pfn);			\
	struct mem_section *__sec = __pfn_to_section(__pfn);	\
	__section_mem_map_addr(__sec) + __pfn;		\
})
#endif
  • page_to_pfn 的转换中,首先需要通过 page_to_section 根据 struct page 结构定位到 mem_section 数组中具体的 section 结构。然后在通过 section_mem_map 定位到具体的 PFN
  • pfn_to_page 的转换中,首先需要通过 __pfn_to_section 根据 PFN 定位到 mem_section 数组中具体的 section 结构。然后在通过 PFNsection_mem_map 数组中定位到具体的物理页 Page

 

4、总结

以上,我们先对物理内存空间有一个基础的了解,明白物理内存空间的内存访问模型和组织模型,下面我们再详细介绍物理内存空间的布局和管理。

点赞+关注,永远不迷路文章来源地址https://www.toymoban.com/news/detail-721218.html

Linux内存管理 | 四、物理地址空间设计模型,Linux内存管理,1024程序员节,Linux驱动开发,Linux内存管理,内存管理,Linux内核开发
欢迎关注 公号&星球【嵌入式艺术】,董哥原创!

到了这里,关于Linux内存管理 | 四、物理地址空间设计模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2.3.1操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

    在存储管理当中,操作系统会负责将外存的一些文件调入到内存当中,以便给CPU调用,如果调用的内容不在内存当中,那么会产生一种中断,叫做缺页中断。然后从外存调数据,调完数据再返回,接着访问之前的断点部分。 在调用的过程当中,如果是一个几十G的文件,调入

    2024年02月03日
    浏览(45)
  • 吃透进程地址空间,理清OS内存管理机制

    Hello,大家好。本文要给大家带来的是有关Linux中的进程地址空间的讲解 首先我们来看着一张图,相信有学习过 C/C++内存管理 的同学一定可以清楚下面的这张图。知道内存中划分了很多的区域,包括 栈区、堆区、静态区、只读常量区、代码段、共享区等等 。 但是呢却不知道

    2024年02月08日
    浏览(45)
  • HBase(18):表空间设计之ROWKEY设计原则

    1 HBase官方的设计原则 1.1 避免使用递增行键/时序数据 如果ROWKEY设计的都是按照顺序递增(例如:时间戳),这样会有很多的数据写入时,负载都在一台机器上。我们尽量应当将写入大压力均衡到各个RegionServer 1.2 避免ROWKEY和列的长度过大 在HBase中,要访问一个Cell(单元格)

    2024年02月12日
    浏览(47)
  • 【Linux】进程地址空间(带你认清内存的本质)

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️Linux之路       🛰️社区 :✈️ 进步学堂       🛰️欢迎关注:👍点赞🙌收藏✍️留言 我们在学习C语言的时候,应该都知道这

    2024年02月07日
    浏览(36)
  • ACE通信设计空间指导

    通信是网络应用程序设计的基础。本章就通信设计空间做了领域分析,介绍了网络应用程序之间互相作用的规则、形式和抽象层次。 本章我们将讨论一下设计空间: 所谓协议,就是一组规则,用来指定“控制信息”和“数据信息”如何在通信实体(譬如,在网络计算环境内部

    2024年02月10日
    浏览(29)
  • HBase(15):表结构设计之名称空间

    1 说明 在一个项目中,需要使用HBase保存多张表,这些表会按照业务域来划分 为了方便管理,不同的业务域以名称空间(namespace)来划分,这样管理起来会更加容易 类似于Hive中的数据库,不同的数据库下可以放不同类型的表 HBase默认的名称空间是「default」,默认情况下,创建

    2024年02月14日
    浏览(35)
  • 3维空间下按平面和圆柱面上排版设计

    AR空间中将若干平面窗口排列在指定平面或圆柱体面上 平面排版思路 指定平面方向向量layout_centre ,平面上的一点作为排版版面的中心layout_position

    2024年02月13日
    浏览(92)
  • 基于微信小程序的考研空间站的设计与实现

    随着互联网发展速度的加快,各行各业都在考虑利用互联网管理信息,微信小程序应用也凭借特有的开放性、开源性等优点被人们青睐。而目前,国内考研学生数量持续大幅增长,对考研信息平台和相关辅导机构的需求也每日剧增,线下考研辅导机构与考生之间并不能很好的

    2024年02月01日
    浏览(49)
  • 一分钟图情论文:《关于图书馆空间嗅觉设计的探讨》

    嗅觉设计是空间设计的一环,探讨嗅觉设计在图书馆空间领域内的应用,可以为图书馆空间建设提供新思路,虽然现在国内的空间嗅觉设计从理论指导到实际运行还未完全成熟,但优秀的嗅觉设计为公共文化空间所带来的积极、正面的影响不容忽视。吴梦菲在《关于图书馆空

    2024年02月02日
    浏览(35)
  • Diffie-Hellman协议中间人攻击方法及协议改进(网络空间安全实践与设计)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628255 资源下载地址:https://download.csdn.net/download/sheziqiong/85628255 第一阶段:Diffie-Hellman 协议的实现 客户端与服务器之间通过 TCP Socket 通信; 客户端与服务器之间通过 Diffie-Hellman 协议协商出对称密钥; 客户端使用协商出的对

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包