ver0.2
ARM搞定了芯片的架构,搞定了总线的架构,搞定了Soc的架构,但是都是设计图纸,是骨架,要让Soc能够真正的工作起来,光有骨头没有肉可不行,各个芯片厂商拿到图纸后,还需要做二次设计,除了CPU外,还需要设计其他的IP-Core,例如DPU、GPU、NPU、VPU等等,但是总不能自己把这个行业的饭都吃了,总要留一碗饭给别人,比如内存和外设。通常Soc上会预留出相应的接口,给其他生产外设和内存的设备厂家留一个机会上车(有钱大家一起赚)。比如高通或者MTK在定型一代SOC之后生产出了核心板,就要预留出相应的接口,可以让下一级供应商拿到之后做二次设计,根据不同的需求和定位,接入性价比更高的外设,这里的外设之一就是内存,不同厂家的内存和不同标准的内存价格自然也不一样。手机上的内存和汽车座舱上用的内存,品质就不一样,毕竟两者工作的环境不一样,那汽车开出去太阳晒一天,发动机散热再加持一下,工作温度都能干到50度,总不能选择和手机一样的内存条吧,这还只是温度一个维度。所以,专业的事情就让专业的厂家来做,我搞好Soc的设计保证它的品质,你搞好内存的设计保证它的品质,大家通过标准接口接合到一起就可以工作了。硬件准备好了,剩下的事情就是交给软件了,那么这里就涉及到管理硬件资源、抽象隔离硬件资源、调度使用软件资源的课题了,一样需要设计思想去驱动,还是以内存为例,为了任务的并发,首先就需要对内存资源做抽象虚拟达到对其他任务隔离的目的,但是硬件资源又是唯一的,那么就需要在任务运行时通过OS和MMU软硬两个维度配合对虚拟的内存资源做调度管理,这个虚拟的体系在ARM框架下有一个专门的名字叫:VMSA(AArch64 Virtual Memory System Architecture)。VMSA体系庞大而复杂,包括但不限于:地址翻译、翻译过程、页表格式、内存访问控制、内存属性、加密管理、虚拟化扩张、TLB等等。作为码农,我们需要花费一点时间才能深入这些课题、但是也要抓住重点,那就是“地址翻译”,或者说地址在不同维度空间的映射转换。
1.1 外部内存控制器
前面章节我们说到芯片厂商给了下游的内存供应商留了一个接口,那么本节我们就在ARM的框架下研究一下这个接口,看看内存厂商和芯片厂商是何如协作共赢的,也就是搞清楚内存相关的总线拓扑,看一看外部的存储设备是如何接入到Soc上,了解一下外存的控制器。
MPMC
先来看一下早期的ARM体系下的关于内存的拓扑,如图1-2所示。能有多早呢?大概要早到2003年。怎么形容那个时候的手册呢?就是真的很清纯。其实这一套架构现在早就过时了,可还是忍不住贴上来给大家看看,追根溯源是一方面,主要还是觉得那个时代的Block图能帮助大家理解很多东西,特别是嵌入式系统早期的存储体系架构是个啥样子,这个图梳理的还是很清楚的,方便大家以后研究别的方向,能有一个感性的认识。说到底还是希望大家能够从一个更宏观的角度去看问题,在宏观的基础上再去进行微观的分析和研究。这就跟历史学派中一个分支-综合派,这个派系做学问的时候都是要花费相当的笔墨讲清楚时代的背景、文化的背景、生产力的背景、一些重点的事件分析甚至要讲清楚当时哲学发展的背景。大家都知道最近大火的3A大作:黑神话.悟空。可是也可以想想悟空为什么在明朝的那个时代诞生,一定是有原因的。三国这一段历史中,为什么历代学者连小说家中的大部分人同情刘备。农民起义中,为什么黄巢造反的影响对于今天的中国影响仍然很深,都需要通过宏观的视角先看过去。普通人看个3、4分就差不多了,历史学家能看懂6、7分,一般政治家能看懂8、9分,伟大的政治家能看懂10分,哈哈哈哈,实在是扯得有点远,不过也没关系,我们不是写论文,大家放松放松。我在想能点开这篇文章,坚持看到这里的朋友,应该也是思想深刻且愿意思考的人吧,但是大家不要太严肃了,我在写虚拟化技术绪论的时候就写过,搞理工科更需要人文的精神在里面调剂一下,有时候能够帮助大家熬过苦恼的阶段获得灵感,不扯了,哈哈,还是回到我们的主线。
通过图1-2,我们可以看到早期的ARM处理器也需要借助外围控制器电路和相应的存储设备连接,图中的控制器叫PrimeCell MPMC(PL176),我们来看看这个MPMC(MultiPort Memory Controller)内部结构是个什么样子,如图1-3所示。
通过上图,我们找到线索了,MPMC内部有一个Dynamic memory controller,通过这个控制器的管控,实现Soc内部总线上的各个Master和外部动态内存设备的联通进而构成一个完整的Soc系统。我们来看一下手册中对MPMC能力的描述:
Features of the PrimeCell MPMC
• Four chip selects for dynamic memory and four chip selects for static memory devices.
• Dynamic memory interface supports DDR-SDRAM, SDRAM, and low-power variants. It also supports Micron SyncFlash types of memory.
• Asynchronous static memory device support including RAM, ROM, Flash, and NAND Flash, with or without asynchronous page mode.
• 16-bit, 32-bit, and 64-bit wide data bus SDRAM and SyncFlash memory support. 16-bit and 32-bit wide data bus DDR-SDRAM support.
• 8-bit, 16-bit, and 32-bit wide static memory support.
• Static memory features include:
— asynchronous page mode read
— programmable wait states
— bus turnaround cycles
— output enable, and write enable delays
— extended wait.
• Read and write buffers to reduce latency and to improve performance.
• Controller supports 2K, 4K, and 8K row address synchronous memory parts. That is, typical 512Mb, 256Mb, 128Mb, and 16Mb parts, with 8, 16, 32, or 64 DQ (data) bits per device.
• Dynamic memory self-refresh mode supported by a Power Management Unit (PMU) interface or by software.
• Power-saving modes dynamically control MPMCCKEOUT and MPMCCLKOUT.
• Two reset domains enable dynamic memory contents to be preserved over a soft reset.
• Little, big, and mixed-endian support.
这里我们只摘录了和存储相关的Feature,可以看出,DDR/LPDDR设备都要靠MPMC的物理接口才能和SOC接合。当然,MPMC除了对外部需要提供标准化的接口适配不同的厂商的内存设备之后,对内部也要兼容内部总线架构的接口规范,这个点我们马上会讲到。
DMC
通过前面章节明白了ARM的祖辈通过一个外部内存控制器连接和管理外部物理内存,那么我们得把视野从2003年拉回来,回到当下看看ARMv8和ARMv9是如何接纳外部内存的。同样我们还是要依托总线架构看一下总线视角下对内存子系统预留的接口情况,如图1-4所示。
对于总线架构和缓存一致性总线不了解的同学,想深入了解的可以看前序的Cache系列的文章,在那里我们做了深入的分析,这里我们只做一个简单的回顾。现代处理器不是单独的一块CPU了,尤其是嵌入式设备领域,一块芯片上集成了众多独立功能单元的IP-Core,例如CPU、VPU、DPU、GPU等,大家分工协作,但是要处理的数据却来自一个共同的地方,那就是内存。各个xPU的内部的处理速度越来越快,尤其是CPU,而访问内存的总线频率却不能跟上,因此为了最大程度的发挥CPU的效能,在处理器内部就增加了总线频率更高Cache模块,根据局部性原理缓存一部分主存中的数据,是CPU无论是取指令和取操作数都是Cache中去获取,而不是到更慢的内存中去获取,这样大多时间内PE-Core操作的都是缓存中的数据,然后根据一定的策略回写到内存中即可。而ARM体系下的内存具有共享属性,不仅可以在CPU的PE-Core之间共享,可以设置为和其他的xPU共享,例如GPU等。既然是共享数据,就涉及到数据的同步问题,张三改完了,李四要用,就要有机制保证李四要访问和操作的共享数据是最新的,而不是过时的数据。那么一致性总线架构就登场了,首先将各个独立的功能单元抽象成Master,总线自己提供slave接口,只要其他Master实现了Slave接口相应的规范,就可以链接到总线架构内和其他Master通信和共享数据。总线架构还设计了探测功能,可以嗅探到各个Master操作Cache的动作,当发现Cache中的数据有更新的时候会通知其他Master并更新其他Master中缓存相同内存副本的Cache Line,从而保证各个Master操作的数据保持一致性,而这个过程绝大多数场景下都是硬件行为,不需要软件干预,因此受到了广大码农的热烈欢迎,但是这个世界上也没有免费的午餐,后面我们也会讨论这些午餐的代价。这里也要明确一点,一致性总线的架构也有不同类别也在不断的迭代当中,比如早一点的嵌入式设备上用的比较多的CCI架构,也有现在比较新的可以应用在服务器集群中的CMN架构,如图1-5所示。
简单的回顾后,我们大致应该了解了一致性总线的作用,而经过观察一致性总线的框图中都有一个叫DMC(Dynamic Memory Controller)的功能单元。根据名字"动态内存控制器"以及前文2003年的故事,我们大致可以确定这个就是我们要找的那个当下ARM最新的体系下连接外部内存条的控制单元。让我们来看一下DMC内部长得什么样子,如图1-6所示。
我们再来看一下手册中对DMC-620这个动态内存控制器能力的整体描述:
Overview
The DMC-620 is an Arm AMBA 5 CHI SoC peripheral, developed, tested, and licensed by Arm. It is a high-performance, area-optimized memory controller that is compatible with the AMBA 5 CHI protocol. It supports the following memory devices:
• Double Data Rate 3 (DDR3) SDRAM.
• Low-voltage DDR3 SDRAM.
• Double Data Rate 4 (DDR4) SDRAM.
The DMC-620 enables data transfer between the SoC and the SDRAM devices external to the chip. It connects to the on-chip system through a single CHI interface, and to a processor through the programmers APB3 interface to program the DMC-620. It connects to the SDRAM devices through its memory interface block and the DDR PHY Interface (DFI).
Features:
• A System Interface (SI) that provides:
— A CHI interface to connect to a CoreLink Cache Coherent Network (CCN) or a CoreLink Coherent Mesh Network (CMN).
— An AMBA5 CHI interface supporting the CHI-A, CHI-B, and CHI-C architecture.
— An APB interface for configuration and initialization.
— An external performance event interface for connecting to CoreSight ™ on-chip debug and trace technology.
— A 128-bit or 256-bit CHI interface.
• A Memory Interface (MI) that provides:
— A DFI 3.1 and 4.0 interface to a PHY that supports DDR3, DDR3L, and DDR4.
— Support for 1:2 DFI frequency ratio mode.
— Support for either a 32-bit wide data SDRAM interface or a 64-bit wide data SDRAM interface.
• Low-power operation through programmable SDRAM power modes.
System interface
The System interface provides protocol conversion between CHI and internal read/write requests.
Because CHI is packet-based, and a slave node only supports read and write semantics, this translation is straightforward at a transaction level because no transformation function is performed.
Memory Interface
Through this interface, the DMC-620 conducts data transactions with the SDRAM and regulates the power consumption of the SDRAM. The DMC-620 uses the ECC information that it receives from the SDRAM to maximize the reliability from these devices.
结合图1-6和手册的摘要,我可以重点关注以下几点:
(1) System interface可以使DMC的电路单元链接到SOC系统。
(2) Memory channel就是连接外部动态内存设备的的通道。
(3) DMC可以将DDR3/LPDDR3/DDR4类型的SDRAM设备链接到SOC系统内部,具体是哪种类型就要看工程实践中芯片厂商的如何实现和配置DFI(DDR PHY Interface)。关于DFI,也是一个完整的不断向前迭代的规范化标准化的接口,如图1-7所示,主流的IP厂商都在支持和维护这个规范,目的就是为了降低集成的成本,这里大家了解一下就行了,我们不做过多的讨论,感兴趣的同学可以自行查阅相关文献。
到这里我们已经打通了从CPU到总线、到DMC、再到DDR SDRAM内存的全部通路,勾勒出了一副SOC内存相关的总线拓扑,我们终于有了一个内存子系统的硬件环境了,可以看到他的全貌了,下一步就可以对这个对这个硬件环境的空间进行抽象与赋能,让它们为软件服务了。(有了根据地,一切都好办了。)
1.2 DDR SDRAM
考虑到文章的完整性,这一节我们会简单的介绍一下DDR SDRAM,DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,双数据率同步动态随机存储器)通常被我们称为DDR,其中的“同步”是指内存⼯作需要同步时钟,内部命令的发送与数据传输都以它为基准。DDR是⼀种掉电就丢失数据的存储器件,并且需要定时的刷新来保持数据的完整性。这一部分内容其实已经超越ARM体系的范畴了,我们不做过多的更深入的讨论,主要还是帮助大家建立起感性的认识,想深入了解的同学可以自行查阅手册或者阅读科普文章。
核心板
看一张SOC集成了外部内存之后的核心板的电路图,如图1-8所示。
DDR板
看一下DDR SDRAM的内存条长个啥样子,如图1-9所示:
信道
从处理器的视角出发,PE-Cores需要和内存交互的信道,从逻辑上划分可以参考图1-10。
迭代
看一下不断迭代的DDR规范,这里我们只列出最近三代的主要feature:
第三代 – DDR3 SDRAM
DDR3的运⾏速度是DDR2的两倍。这是通过进⼀步改进总线信号来实现的。DDR3的预取缓冲区宽度为8位,是DDR2的两倍。DDR3内存的传输速率为800~1600MT/s。DDR3在1.5V的低电压下⼯作,⽽DDR2的1.8V,则能耗降低了40%。DDR3有两个附加功能,即ASR(⾃动⾃刷新)和SRT(⾃刷新温度)。DDR3 IC于2007年在市场上发布。
第四代 – DDR4 SDRAM
DDR4的运⾏速度是DDR3的两倍。DDR4在低⼯作电压(1.2V)和更⾼的传输速率下运⾏。DDR4的传输速率为2133~3200MT/s。DDR4增加了bank group技术。DDR4可以在时钟周期内处理4个数据,因此DDR4的效率优于DDR3。DDR4有⼀些附加功能,如DBI(数据总线反转)、数据总线上的CRC(循环冗余检查)和命令/地址奇偶校验。这些功能可以增强DDR4内存的信号完整性,并提⾼数据传输/访问的稳定性。DIMM上单个DRAM的独⽴编程可以更好地控制端接。DDR4 IC于2014年在市场上发布。
第五代-DDR5 SDRAM
DDR5的运⾏速度是DDR4的两倍。DDR5的传输速率为3200~6400 MT/s。DDR5规范于2018年11⽉发布。
寻址
这个寻址指的是,CPU发起对内存的访问的场景下,内存数据和Cache Line中的数据的映射关系。我们知道AArch64的体系下,一次内存的操作要用到地址总线,宽度也是64位的,根据规范,这一次操作无论是读还是写要用到的数据总线宽度也是64位的(或者说8个字节的宽度),这也就是说为什么在设计一些数据结构的时候要注意内存对齐这一说,一切都是为了效率的最大化。
结语
本文的主旨就是为了介绍内存的空间,我们从总线架构开始层层递进,交代清楚了,外存是如何通过DDR-PHY、DMC接入到了我们的SOC系统。着重介绍了动态内存控制器,回忆了一下早期的型号,进而引出了现在内存管理器的架构,最后简要介绍了一下物理内存DDR。其实这一篇文章还是有姊妹篇的,是的,写完之后发现太长了,于是又拆开了。下一篇我们会从软件和管理的角度对内存的空间进一步的细分,请大家保持关注。
Reference
[00] <corelink_dmc520_technical_reference_manual_100000_0202_00_en.pdf>
[01] <corelink_dmc620_dynamic_memory_controller_technical_reference_manual_100568_0100_00_en.pdf>
[02] <IP-Controller/DDI0331G_dmc340_r4p0_trm.pdf>
[03] <80-ARM-IP-cs0001_ARMv8基础篇-400系列控制器IP.pdf>
[04] <arm_cortex_a725_core_trm_107652_0001_04_en.pdf>
[05] <DDI0487K_a_a-profile_architecture_reference_manual.pdf>
[06] <armv8_a_address_translation.pdf>
[07] <cortex_a55_trm_100442_0200_02_en.pdf>
[08] <learn_the_architecture_aarch64_memory_management_guide_101811_0103_03_en.pdf>
[09] <learn_the_architecture_armv8-a_memory_systems_100941_0101_02_en.pdf>
[10] <80-ARM-MM-cs0001_DDR内存介绍.pdf>
[11] <80-ARM-MM-HK0001_一文搞懂DDR-SDRAM工作原理.pdf>
[12] <DDI0269.pdf>
[13] <corelink_cci550_cache_coherent_interconnect_technical_reference_manual_100282_0100_01_en.pdf>
[14] <corelink_cmn600_technical_reference_manual_100180_0302_01_en.pdf>
[15] <DDR_PHY_Interface_Specification_v5_1.pdf>
[16] <80-LX-MM-bin0002_一步一图带你深入理解Linux虚拟内存管理.pdf>
Glossary
MMU - Memory Management Unit
TLB - translation lookaside buffer
VIPT - Virtual Index Physical Tag
VIVT - Virtual Index Virtual Tag
PIPT - Physical Index Physical Tag
VA - Virtual Address
PA - Physical Address
IPS - Intermediate Physical Space
IPA - Intermediate Physical Address
VMID - virtual machine identifier
TLB - translation lookaside buffer(地址变换高速缓存)
VTTBR_EL2 - Virtualization Translation Table Base Registers(ArmV8 寄存器)
ASID - Address Space Identifier (ASID)
DMC - Dynamic Memory Controller
DDR SDRAM - Double Data Rate Synchronous Dynamic Random Access Memory,双数据率同步动态随机存储器
TBI - Top Byte Ignore
VMSA - AArch64 Virtual Memory System Architecture
LPAE - Large Physical Address Extension
MPMC - MultiPort Memory Controller
DFI - DDR PHY Interface