内存

news/2024/12/25 0:25:02/文章来源:https://www.cnblogs.com/xingxingx/p/18628955

基础知识

MMU包括TLB和页表遍历单元(TWU)两个部件;

  • TLB:是一个高速缓存,用于缓存页表转换的结果;
  • TWU:页表的维护是软件进行的(这个很好理解,虚拟地址映射到哪个物理地址放给用户去设置),但是具体页表的查询是硬件完成的,这个硬件单元就是TWU
    mmu有两个职责:
  • 第一个:虚拟地址到物理地址的转化;
  • 第二个:页表属性和内存访问权限控制等;(例如cache,读写属性等)

va->pa的查询过程

  1. 处理器根据虚拟地址来判断使用TTBR0还是TTBR1.当虚拟地址第63位为1时(0xFFFF_xxx),选择TTBR1;当虚拟地址第63位为0时(0x0000_xxx),选择TTBR0;TTBR存放这L0页表的基地址;
    • 各个进程都有自己的页表基地址,所以进程切的时候,需要将自己的页表基地址设置进入TTBR0;
cpu_do_switch_mm:msr	ttbr0_el1, x3			// now update TTBR0
  1. BASE地址 + index得到页表项,页表项中存放的就是下级页表的BASE地址;
  2. 重复2,一直到pte,pte中存放的就是实际的pfn;
    set_pte(ptep, pfn_pte(phys >> PAGE_SHIFT, prot));
    

页面粒度

4k

构成:(9 + 9 + 9 + 9 )+ 12(4k)

16k

构成:(1 + 11 + 11 + 11)+ 14(16k)

64k

构成:(6 + 13 + 13) + 16(64k)

ttbr0,ttbr1

arm64有两套页表,分别是ttbr0、ttbr1;

  • ttbr0:存放的是0x000_xxxxx开头的虚拟地址的页表基地址
  • ttbr1:存放的是0xffff_xxxx开头的虚拟地址的页表基地址

当映射一个虚拟地址的时候选择ttbr0还是ttbr1由mmu硬件自动完成;

页表描述符

l0~l2

  • 无效页表项:
  • 块类型:存放了最终的物理地址;
    • 粒度4k:存放2M连续的物理地址
    • 粒度16k:存放32M连续的物理地址
    • 还包括低位属性,高位属性
  • 页表类型:存放了指向下一级页表的基地址;

l3

  • 包含输出地址,pfn;
  • 低位属性,高位属性

属性

页表描述符中提到了高位属性,和低位属性;这些属性常见的有:

1 共享性与缓存性:

缓存性就是是否带有cache属性;
那什么是共享性呢:多核处理器系统中某一个内存区域的高速缓存可以被哪些观察者看到,(类似cache中的poc,pou)

  • 没有共享性:只有本地CPU能观察
  • 内部共享:内部共享的CPU的观察
  • 外部共享:能被外部共享的观察者观察到。比如CPU&&GPU(外部ip)&&DMA

dma-coherent就是利用这里修改的(待找代码确认)

2 访问权限

就是读写权限;
比如进程创建的缺页中断写时复制,就利用了这个特性;将页表项设置为只读属性;(确认实际的代码页表确认)

3 执行权限

4 访问标志位

5 全局和进程特有tlb

硬件管理访问与脏位

之前访问位与脏位是通过软件机制中的缺页中断进行管理;
硬件管理访问位与脏位的意思就是由硬件去自动更新;

相关寄存器

tcr

sctlr

ttbr

内存属性

1 普通内存

2 设备内存

  • G:聚合
  • R:指令重排
  • E:提前写应答:(这个写应答的具体作用是?)
    • 往设备写数据的过程是:1写入缓冲区,2往外部设备写;是能了提前写应答当达到缓冲区时就会发生写应答;

内存属性

与缓存有关,放在MMAIR寄存器中;

	ldr	x5, =MAIR(0x00, MT_DEVICE_nGnRnE) | \MAIR(0x04, MT_DEVICE_nGnRE) | \MAIR(0x0c, MT_DEVICE_GRE) | \MAIR(0x44, MT_NORMAL_NC) | \MAIR(0xff, MT_NORMAL) | \MAIR(0xbb, MT_NORMAL_WT)msr	mair_el1, x5

页表项中使用AttrIndx[2:0]作为索引来索引这些内存属性;

如何理解AttrIndx与MMAIR

  • 如下配置的前提下:
	ldr	x5, =MAIR(0x44, MT_NORMAL_NC) | \MAIR(0xbb, MT_NORMAL_WT)msr	mair_el1, x5

比如设置MT_NORMAL_NC,就代表使用0x44吗?
使用MT_NORMAL_WT,就代表使用0xbb吗?

  • 如果是:
	ldr	x5, =MAIR(0xbb, MT_NORMAL_NC) | \MAIR(0x44, MT_NORMAL_WT)msr	mair_el1, x5

比如设置MT_NORMAL_NC,就代表使用0xbb吗?
使用MT_NORMAL_WT,就代表使用0x44吗?

也就是说mair_el1形成了一张表,可以理解为一个数组,数组中的成员是软件可配置的;
页表属性的AttrIndx对应到这个数组的成员中

恒等映射

如何理解页表创建

首先正向看:

  • ttbr对应的基地址 + pgd的index,可以得到一个地址;这个地址的内容存放的是pud的地址
  • pud的地址 + pud的index,可以得到一个地址;这个地址的内容存放的是pmd的地址

以这两个为例,从C语言的角度看,就是地址里面存放了一个内容,这个内容其实又是一个地址
由于64为系统,unsigned long long的大小就是指针的大小,就进行了替换;

所以创建页表就是往地址的内容里面填地址;

		pud_phys = alloc_pgtable();	/* 分配pud的地址,这是一个物理地址 */set_pgd(pgdp, __pgd(pud_phys | PUD_TYPE_TABLE));	/* 把pud的物理地址设置给pgd */

内存属性内核代码分析

mmap

cma coherent alloc

伙伴系统的内存属性在哪儿?

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

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

相关文章

LangChain简单大模型应用

LangChain官方示例教程(Build a Simple LLM Application)。重新组织顺序及说明方式,更加适合新手阅读。LangChain官方示例教程(Build a Simple LLM Application):https://python.langchain.com/docs/tutorials/llm_chain/将该官方示例教程适当调整及优化依赖pip install lang…

Elasticsearch filter context 的实践案例

知识背景 在 ES 查询优化的建议里,很多时候为了避免算分逻辑和利用缓存逻辑,Elastic 会建议大家使用 filter 条件。 filter 的使用条件和原理具体可以参照之前写的博文《Elasticsearch filter context 的使用原理》 这里我们来研究 2 个实用案例,具体的感受一下 filter cont…

产品发展的六阶段

一个成熟的互联网产品从最初的创意到完全成熟,通常需要经历以下几个主要阶段。每个阶段都有特定的目标、核心任务和关键成果,以下是详细的解析。 一、创意阶段 1、创意阶段的核心目标 1.1 识别用户需求 创意阶段的首要任务是发现并明确目标用户的痛点和需求。通过市场调研、…

【unity]学习制作类银河恶魔城游戏-2-

导入新资产切割新资产切割完成修改大小和清晰度球体已经设置了刚体和碰撞体积,直接应用给人物,改名circle为player中心点问题 因为切割的原因,碰撞模型的中心点和人物的中心点不相吻合解决:在子路径下渲染人物图片,将二者的中心点手动对齐手动对齐保存更改更改碰撞体模型运…

DevNow x Notion

DevNow x Notion: DevNow 支持了 Notion 作为其文档系统,可以帮助用户在 Notion 更高效地管理文档,实现文档的集中管理和协作。前言 Notion 应该是目前用户量比较大的一个在线笔记软件,它的文档系统也非常完善,支持多种文档格式,如 Markdown、富文本、表格、公式等。 早期…

平安夜吃苹果

祝大家平安夜快乐 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 …

基于Three.js的大屏3D地图(一)

依赖安装 yarn add three yarn add @types/three yarn add d3-geothree库安装后在node_modules下其还包含核心three/src和插件three/example/jsm的源码,在开发调试时可以直接查阅。使用Three.js过程中会涉及到许多的类、方法及参数配置,所以建议安装@types/three库;不仅能提…

Java 变量和运算符

Java 变量和运算符1. 变量(Variable)1.1 何为变量 1.2 数据类型(Data Types)1.2.1 整型:byte、short、int、long 1.2.2 浮点类型:float、double 1.2.3 字符类型:char 1.2.4 布尔类型:boolean1.3 变量的使用1.3.1 步骤1:变量的声明 1.3.2 步骤2:变量的赋值1.4. 基本数…

k8s阶段10 k8s指标流水线, 自定义流水线和HPA

1 Kubernetes指标流水线 资源指标Kubernetes有一些依赖于指标数据的组件,例如HPA和VPA等Kubernetes使用Metrics API暴露系统指标给这些组件 #只暴露nodes和pods上的内存,CPU指标该API仅提供CPU和内存相关的指标数据负责支撑Metrics API、生成并提供指标数据的组件,成为核心指标…

目标检测数据集标注工具 CVAT 使用方法【转载】

目标检测数据集标注工具 CVAT 使用方法 原文地址,RSMX-Blog www.cnblogs.com/rsmx/CVAT在线网站(上传下载较慢,数据集较大时不建议使用):https://cvat.org/ CVAT本地部署方法(Linux):https://zhuanlan.zhihu.com/p/388477205官网地址:https://www.cvat.ai/ 1. 使用邮…

浏览器基础知识点(二)

一、浏览器输入一个URL并enter时,发生了什么?用户在浏览器输入一个URL,并按下enter键时,里面包含了非常多的技术细节。 第一,DNS解析: 用户输入的URL通常会是一个域名地址,直接通过域名是无法找到服务器的,因为服务器的本质上是一台拥有IP地址的主机。 需要通过DNS服务…