ver0.1
[看前序文章有惊喜。]
前言
前面花了很大的精力把ARM构建的VMSA中的几个核心的议题给大家做了介绍,相信大家已经能够理解并掌握ARM的内存子系统的工作原理大致框架。接下来我们会规划一些文章,对ARM内存子系统的一些细节做一下介绍,使ARM的内存子系统更加的丰满。本文,我们将介绍内存模型的的类型(Memory Type)。
正文
1.1 背景
在介绍内存模型的类型之前,咱们先来听个神话故事。
在远古时期,宇宙尚未形成,天地未分,整个世界处于一片混沌之中。这个混沌的世界无边无沿,没有上下左右,也不分东南西北,样子好像一个浑圆的鸡蛋。在这个浑圆的东西当中,孕育着一个人类的祖先—盘古。盘古在这个混沌的世界中孕育了一万八千年,终于成熟。他醒来后,发现周围一片漆黑,什么都看不见。于是,他拔下自己的一颗牙齿,变成一把威力巨大的神斧,向四周猛劈过去。随着一声巨响,混沌被劈开,轻而清的阳气上升,变成了高高的蓝天;重而浊的阴气下沉,变成了广阔的大地。从此,宇宙间就有了天地之分。
感谢盘古,不然我们现在还生活在一篇混沌当中。接下来,一起看看计算机的世界,如图1-1所示。
如同一个公司光有老总,啥事儿也搞不成,所以必须配备必要的部门组织到一起才能够正常的工作。CPU就是这个公司的老总,接下来就是配备相应的部门,上面的各个功能单元不是一个计算机系统的全部,但是已经足够复杂。有了这些职能部门后,CPU就得考虑如何去管控它们了,怎么能让他们统一协作,最大效率的发挥作用,给自己挣钱了。那到底应该如何去管理呢?回答这个问题之前是不是得给这些职能部门安排个办公室或者说至少应该有个工位吧,老板要发号指令、表扬、还是要惩罚,是不是得找到具体职员的位置啊。提到了位置,就有了一种熟悉的配方油然而生的感觉,位置不就是地址嘛,ARM的内存空间就处处充满了地址。到这里,老板(CPU)眼前一亮,干脆把这些设备抽象成内存模型算了,统一编码到内存空间(注意这一块不同的体系架构还是不一样的,比如x86和ARM就有一些区别,主要是编地方式和访问方式),“老子以前怎么教内存打枪,现在照样能教这些设备怎么打炮”。于是,ARM这个老板设计了如图1-2的内存模型。
ARM让CPU工作以前,就得把各个智能部门摆正位置,安排合理的工位。这些工位所在的区域就是物理内存空间,而这个摆放的过程和盘古的大斧子工作流程是一样的,混沌在一起太烦人了,没有条理、没有秩序怎么能行呢?按照图1-2,先砍一斧子给那些Peripheral、再砍一部分给固件(ROM)、再砍一部分给内存(DDR)。砍完了之后,就清晰多了:
(1) Peripheral的种类最多,SOC外部的设备(Camera、LCDs、Sensor…)大家通过不同的外围总线(接口),接入到SOC的内部总线架构上;而内部的设备(ADSP、GPU、NPU…)可以直接通过SOC内部的总线(接口)接入到SOC的总线架构上。
(2) 固件设备(启动程序、安全相关程序… 出厂时刷写,不能改变。)也通过物理地址空间,链接进SOC架构中。
(3) DDR(SDRAM)内存设备也通过DDR链接进总线架构。
ARM给了这些设备安排妥当之后,并且进行了物理地址空间的编址之后,CPU就可以按照地址去访问他们进行工作了。那CPU是不是可以为所欲为,想干啥就干啥呢?比如一个老板,给财务发送了一条指令让她去写代码、或者让她将公司账上的钱直接转给老板的私人账户,显然是不行的。这些设备也一样,比如ROM区域是只能够读的,Peripheral区域由于不止CPU能操作它,设备同样可以随机的操作它们,因此这段区域通常是不能缓存的。DDR这个设备比较好说话,通常可以干的事情有很多,既可以装下代码执行,也能读写被做操作的数据,还可以共享给Peripheral设备共享数据(比如和GPU共享要被渲染的图像数据、和ADSP共享要被播放的音频数据…)。怎么能描述这些设备的个性