ARM架构的存储类型(Memory Type)是内存子系统设计的核心概念,用于定义处理器对不同内存区域的访问行为特性,包括缓存、缓冲、乱序执行、顺序一致性等,正确的存储类型配置直接影响系统性能、功耗以及硬件交互的正确性,尤其在嵌入式和移动设备中,合理划分存储类型是优化系统设计的关键。

ARM存储类型的分类与特性
ARM架构将内存访问行为划分为三大核心存储类型:Strongly-ordered(强序)、Device(设备)和Normal(普通),每种类型针对不同的应用场景设计,确保内存访问的高效性与可靠性。
Strongly-ordered(强序)类型
Strongly-ordered类型要求所有访问操作必须严格按照程序顺序完成,不支持乱序执行、缓存或缓冲,这种类型的内存主要用于需要严格顺序保证的外设寄存器和硬件控制接口,例如中断控制器(GIC)、系统时钟控制寄存器、电源管理单元(PMU)等。
处理器在访问Strongly-ordered内存时,会自动插入内存屏障(Memory Barrier)指令,确保前序访问操作完全完成后才执行后续访问,避免因硬件流水线或缓存导致的时序错误,在配置DMA控制器时,必须先设置DMA通道地址(Strongly-ordered),再启动传输,否则DMA可能读取到错误的数据地址;再如,多核系统中,一个核心修改共享标志位后,需通过强序内存访问确保其他核心立即看到更新,避免指令重排导致的竞争条件。
Device(设备)类型
Device类型用于访问外设寄存器和内存映射的I/O设备(如UART、GPIO、PCIe控制器等),与Strongly-ordered不同,Device类型允许有限的缓冲行为,但仍不支持缓存,根据设备访问的实时性和一致性要求,Device类型进一步细分为多个子类,核心差异在于“共享性(Shareable)”“读分配(Read Allocate)”“写分配(Write Allocate)”等属性(通过MAIR寄存器配置):

- Device-nGnRnE:Non-shareable、Non-cacheable、Non-bufferable、Non-executable,禁止缓存和缓冲,访问必须直接响应,适用于实时性要求极高的外设(如GPIO数据寄存器),确保读取的电平状态或写入的控制信号立即生效。
- Device-nGnRE:Non-shareable、Non-cacheable、Bufferable、Non-executable,允许写操作缓冲(如UART发送缓冲区),处理器可将多个字节写操作合并为一次总线传输,提高效率,但读操作仍需立即响应,避免数据丢失。
- Device-GRE:Shareable、Cacheable、Bufferable、Executable(较少见),仅适用于特殊设备(如某些高速网络接口),需结合缓存一致性协议处理多核访问,但通常设备类型默认禁止缓存,以避免外设数据被缓存导致读取延迟。
Normal(普通)类型
Normal类型是ARM体系中最常用的存储类型,用于访问系统内存(如DDR RAM、SRAM、Nor Flash等),支持缓存、缓冲、乱序执行等优化机制,以最大化处理器访问内存的性能,根据可缓存性(Cacheable)、可缓冲性(Bufferable)、共享性(Sharable)和可执行性(Executable),Normal类型可分为多种子类型:
- Normal Non-cacheable:不可缓存,但支持缓冲和乱序执行,适用于内存映射但无需缓存的设备(如某些FPGA寄存器)或需要“写穿(Write-Through)”策略的内存区域,确保数据直接写入内存,避免缓存一致性问题。
- Normal Cacheable:可缓存,支持写回(Write-Back)或写穿(Write-Through)缓存策略,适用于程序代码段(如.text段)和数据段(如.data段),通过缓存减少内存访问次数,提升命中率。
- Normal Cacheable and Bufferable:可缓存且可缓冲,支持写分配(Write-Allocate)和读分配(Read-Allocate),适用于需要减少写延迟的共享内存区域(如DMA缓冲区、显存),缓冲机制允许处理器将写操作暂存到缓冲区,合并连续的小数据块写请求,降低总线占用率。
共享性方面,Normal Non-shareable(Non-shareable)表示内存仅被单个处理器核心访问(如私有栈、堆),无需处理缓存一致性问题;Normal Shareable(Shareable)表示内存可被多个核心访问(如共享RAM、跨进程通信缓冲区),必须通过缓存一致性协议(如MESI、MOESI)确保多核数据一致,避免“脏读”或“数据覆盖”。
存储类型的配置与影响
存储类型的定义通过内存属性描述符实现,在ARMv8架构中,MAIR(Memory Attribute Indirection Register)寄存器用于定义8种内存属性(如可缓存性、缓冲性、类型等),页表中的属性字段(AttrIndex)指向MAIR条目,从而确定内存区域的存储类型。
- Normal Cacheable Write-Back Write-Allocate类型对应MAIR中的特定编码,使内存支持写回缓存(减少内存写次数)和写分配(缓存未命中时加载整个缓存行),适用于高性能计算场景;
- Device-nGnRnE类型对应MAIR中“非缓存、非缓冲”的编码,确保外设访问直接响应。
存储类型直接影响内存访问的时序和效率:

- 性能:Normal类型通过缓存和缓冲机制,可将内存访问延迟从纳秒级(DDR RAM)降至缓存命中时的周期级(L1缓存约1-2周期);而Device和Strongly-ordered类型因无缓存,访问延迟较高,但保证了实时性。
- 功耗:Normal类型的缓存可减少内存访问次数,降低动态功耗;但频繁的缓存维护操作(如写回、失效)可能增加额外开销。
- 一致性:Shareable的Normal内存需依赖缓存一致性协议(如ARM的MESI协议),确保多核数据一致,而Device和Strongly-ordered内存因无缓存,一致性由硬件总线保证(如写穿机制)。
存储类型应用场景示例
| 存储类型 | 子类型 | 典型应用场景 | 关键特性要求 |
|---|---|---|---|
| Strongly-ordered | 中断控制器、DMA配置寄存器、电源管理寄存器 | 顺序执行、无缓存、无缓冲 | |
| Device | Device-nGnRnE | GPIO数据寄存器、实时时钟(RTC)寄存器 | 无缓存、无缓冲、直接响应 |
| Device | Device-nGnRE | UART发送/接收缓冲区、SPI数据寄存器 | 无缓存、写缓冲、读直接响应 |
| Normal | Normal Non-shareable | 私有栈、进程堆、内核代码段(单核) | 可缓存、非共享、乱序执行 |
| Normal | Normal Shareable | 共享RAM、DMA缓冲区、跨核通信队列 | 可缓存、共享、缓存一致性协议支持 |
相关问答FAQs
Q1:为什么外设寄存器通常不使用Normal存储类型?
A:外设寄存器需要严格的实时性和顺序性,而Normal类型支持缓存和乱序执行,可能导致寄存器值读取延迟或顺序错乱,配置外设后立即读取状态寄存器,若使用Normal Cacheable类型,缓存可能保存旧值,导致读取结果与实际硬件状态不一致;若使用Normal Bufferable类型,写操作可能被缓冲,导致控制信号延迟发送,外设寄存器必须使用Device或Strongly-ordered类型,确保访问直接、顺序、无缓存,满足硬件交互的实时性要求。
Q2:Normal Bufferable属性如何提升系统性能?
A:Normal Bufferable属性允许处理器将写操作暂存到写缓冲区(Write Buffer),合并连续的小数据块写请求(如多个字节写操作合并为32位写),减少总线占用次数和内存访问延迟,在频繁写入显存(如GPU渲染输出)时,Bufferable机制可将分散的像素数据写操作缓冲后批量传输,避免频繁占用总线,提升整体吞吐量,但需注意,Bufferable属性可能引入数据顺序问题(如缓冲区未刷新导致后续读取旧值),因此需结合内存屏障(如DMB指令)确保数据按序可见,适用于允许短暂延迟但要求高吞吐量的场景。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复