linux内存从0到1学习笔记(五,内存分类)

高桐@BILL 高桐@BILL     2022-12-02     542

关键词:

一、内存类型

ARMv8架构处理器定义了两种类型的内存类型,分别是普通内存(Normal Memory)和设备内存(Device Memory)。

二、普通内存

        普通内存对应MT_NORMAL属性;

        普通内存由于其弱一致性(weakly ordered),没有额外限制,可以提供最高的内存访问性能。通常代码段、数据段、和其他数据都放在普通内存中。普通内存可以让处理器做很多优化,如分支预测,数据预读,高速缓存行预读和填充,乱序加载等硬件优化。

        普通内存是可以设置高速缓存开关,对应如MT_NORMAL_NC。表示关闭高速缓存,其中NC表示Non-Cacheable.

        除此之外,我们可以设置高速缓存为内部共享和外部共享的高速缓存。

        一个单核处理器系统中,除了处理器之外,有其他的可以访问内存的硬件单元,这些硬件单元通常具有访问内存总线(bus master)的能力,如DMA设备,GPU等。一个多核系统中,DMA设备和GPU通过总线连接到DDR内存,而处理器也通过系统总线连接到DDR内存。

  • 如果一个内存区域被标记为“不可共享”,则表示仅能被一个处理器访问,其他处理器不能访问。
  • 如果被标记为“内部共享”,则可以被多个处理器访问和共享,但其他如DMA设备,GPU等硬件不可以访问。
  • 如果标记为外部共享,则所有处理器和其他访问内存的硬件(GPU,DMA设备等)均可以访问。

三、设备内存

设备内存通常用来映射外设的。处理器访问设备内存会有很多限制,访问此类内存必须严格按照指令顺序来执行,不能进行预测访问。

ARMv8架构定义了多种设备内存的属性(G表示Gathering,指聚合的意思,意思是在同一个内存属性的区域中允许多笔命令能并成一条命令)。(NG表示不聚合 non Gathering),如下:

  • Device-nGnRnE:对应MT_DEVICE_nGnRnE属性,不支持聚合操作,不支持指令重排,不支持提前写应答。
  • Device-nGnRE:对应MT_DEVICE_nGnRE属性,不支持聚合操作,不支持指令重排,支持提前写应答。
  • Device-nGRE
  • Device-GRE:对应MT_DEVICE_GRE属性,支持聚合操作,支持指令重排,支持提前写应答。

linux内存从0到1学习笔记(8.7dma-buf代码解读)

一,基本操作与设备DMA访问drivers/dma-buf/dma-buf.c二,CPU访问DMA缓冲区对象drivers/dma-buf/dma-buf.c三,隐式Fence轮询支持drivers/dma-buf/dma-buf.c四,DMA-BUF统计drivers/dma-buf/dma-buf-sysfs-stats.c五,DMA缓冲区ioctls操作include/uapi/linux/ 查看详情

linux内存从0到1学习笔记(七,用户空间虚拟内存之二-内存空间的建立)(代码片段)

在使用load_elf_binary装在一个ELF二进制文件时,将创建进程的地址空间。Linux下的exec系统调用该函数来加载ELF文件。linux_mainline-5.17.0/fs/binfmt_elf.c823staticintload_elf_binary(structlinux_binprm*bprm)824825 structfile*interpreter= 查看详情

linux内存从0到1学习笔记(二,arm64物理内存)

写在前面我们先通过一张图来里哦啊接下ARM处理器的内存管理架构;2.1ARM处理器的内存管理架构ARM处理器内核:是指ARM架构的CPU中间的核心芯片,由单晶硅制成,用来完成所有的计算、接受/存储命令、处理数据等... 查看详情

linux内存从0到1学习笔记(四,tlb)

...、TLB简介        Kernel初始化的时候,会在初始化内存中创建页表;而处理器读取指令和数据的时候需要首先通过MMU查表得到物理地址,然后在访问物理地址读取指令或数据。MMU查表过程汇中需要4次访问内存,... 查看详情

linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)

写在前面在linux启动的那一刻,内存管理就已经开始了。在内核中,实现物理内存管理的allocator包括:初始化阶段物理内存管理memblock连续物理内存管理buddy非连续物理内存管理vmallocallocator小块物理内存管理slaballocator在系统初始... 查看详情

linux内存从0到1学习笔记(8.13dma内存调试一)

...常使用过程中常常会遇到哪些问题呢?当然,dma-buf也是内存使用大法的一部分,那就免不了遇到这几大件:1.dma不足(合理使用),这部分的优化慎之又慎,要么从系统内存的大锅里多盛一点,要么自己节衣缩食;2.dma-buf泄漏(... 查看详情

linux内存从0到1学习笔记(8.13dma内存调试一)

...常使用过程中常常会遇到哪些问题呢?当然,dma-buf也是内存使用大法的一部分,那就免不了遇到这几大件:1.dma不足(合理使用),这部分的优化慎之又慎,要么从系统内存的大锅里多盛一点,要么自己节衣缩食;2.dma-buf泄漏(... 查看详情

linux内存从0到1学习笔记(七,用户空间虚拟内存之三-内存映射)(代码片段)

...通常C标准库只提供了一个函数,由应用程序用来创建内存映射,接下来该函数调用在内部转换为适合于体系结构的系统调用mmap和mmap2。可使用munmap系统调用删除映射。一、内存映射简介        mmap完成的是将物理内... 查看详情

linux内存从0到1学习笔记(九,内存优化调试之三-内存拆解)---持续更新(代码片段)

写在前面我们在日常的工作当中需要各种手段来调试内存,尤其是在内存泄漏的情况下,我们需要一种手段来统计内存的使用去向,以确定内存使用不合理的方向。或者物理内存有限的情况下,需要对内存进行优... 查看详情

linux内存从0到1学习笔记(6.3,物理内存初始化之内存基本数据结构初始化)(代码片段)

写在前面这部分主要介绍,bootmem_init()内存基本数据结构初始化,如内存节点,内存域。linux_mainline-5.17.0/arch/arm64/mm/init.c321void__initbootmem_init(void)322323 unsignedlongmin,max;324//获取最大最小页号;325 min=PFN_UP(memblock_start_of_DRAM( 查看详情

linux内存从0到1学习笔记(8.8无限dmafence)

在不同时间,结构体dma_fence具有无限期的时间,直到dma_fence_wait()执行完成。例如:FutureFence(未来围栏),在HWC1中使用的,用于在显示器不再使用缓冲区时发出信号,并在屏幕更新时创建,以使得缓冲区可见。此围栏完成的时... 查看详情

linux内存从0到1学习笔记(8.8无限dmafence)

在不同时间,结构体dma_fence具有无限期的时间,直到dma_fence_wait()执行完成。例如:FutureFence(未来围栏),在HWC1中使用的,用于在显示器不再使用缓冲区时发出信号,并在屏幕更新时创建,以使得缓冲区可见。此围栏完成的时... 查看详情

linux内存从0到1学习笔记(8.9可恢复硬件页面错误的含义)

...起的页面错误显然会阻碍加速器上运行的任务,通常需要内存分配来解决错误。但是,不允许内存分配来控制DMA围栏的完成,这意味着使用可恢复页面错误的任何工作负载都不能使用DMA围栏进行同步,而必须改用由用户空间控制... 查看详情

linux内存从0到1学习笔记(8.9可恢复硬件页面错误的含义)

...起的页面错误显然会阻碍加速器上运行的任务,通常需要内存分配来解决错误。但是,不允许内存分配来控制DMA围栏的完成,这意味着使用可恢复页面错误的任何工作负载都不能使用DMA围栏进行同步,而必须改用由用户空间控制... 查看详情

linux内存从0到1学习笔记(9.6,内存优化调试之page_owner拆解)

...过,pageowner用于跟踪每个页面的分配细节。如上图,当有内存被分配时,内存分配调用栈、进程ID、分配时间、掩码信息等都会被记录下来。因此我们可以通过分析这些信息来了解运行时情况下的内存布局;但是,page_owner信息很... 查看详情

linux内存从0到1学习笔记(9.10内存优化调试之panic_on_oom介绍

通过配置/proc/sys/vm/panic_on_oom文件节点可以使能或禁用out-of-memory的panic。接下来我分享下在对该节点功能及代码架构的学习笔记;一,简介文件节点路径:/proc/sys/vm/panic_on_oom相关变量:vm.panic_on_oom该节点有三个值,分别是0,1,2... 查看详情

linux内存从0到1学习笔记(三,高速缓存)

...RMv8最多可以支持7级的高速缓存,即L1级~L7级。接着是内存,本地磁盘。越往上的缓存存储空间越小,速度越快,成本也更高;越往下的存 查看详情

linux内存从0到1学习笔记(9.7内存优化调试之page_owner内存分配堆栈详解)---更新中

...序,解析。最终可以确认那些任务或进程占用了多少内存。无论是正常分配的,还是内存黑洞的内存,我们都可以通过解析pageowner拆分出来。那么接下来我们对pageowner中的内存分配堆栈进行一个详细的介绍和分析。以... 查看详情