目录
[2.1 Normal memory](#2.1 Normal memory)
[2.2 Device Memory](#2.2 Device Memory)
[2.2.1 Gathering](#2.2.1 Gathering)
[2.2.2 Reordering](#2.2.2 Reordering)
[2.2.3 Early Write Acknowledgement](#2.2.3 Early Write Acknowledgement)
大家好,今天是悲伤的肌肉。
在调研区域控制器芯片时,发现了S32Z、Stellar SR6P7等芯片均采用的是Cortex-R52\R52+内核,该内核架构为Armv8-R;
在阅读内核手册时对内存模型里出现很多之前没有接触过的概念感到困惑,例如Normal memory\Device Memory、Device_nGnRnE;因此简单总结下,以备不时之需。
1.内存模型的必要性
首先我认为比较关键的是搞明白内存模型存在的必要性。
以TC3xx为例,我们关注比较多的就是cacheable和non-cacheable的memory地址,涉及到外设模块操作就直接在地址映射表里找基地址,如下图:
从这个角度来看,内存模型其实就是定义了memory是如何被寻址,定义了memory自身的一些行为。例如,TC3xx定义了A和8的Segment为Code存放区,那我们设计ld的时候自然会以此为基础,同时由于是Code区,它的属性就为ReadOnly。整体设计思路如下图:
这些属性不止是告诉我们,同时还会告诉处理器应该如何处理不同地址的访问。把这个思路迁移到Armv8架构里,会发现万变不离其宗, 同样需要指定memory不同地址的属性,这样CPU才能单独执行访问。
2.Armv8-R内存模型分类
在Armv8-R里,内存模型被分成了两类:Normal memory和Device Memory。
2.1 Normal memory
Normal Memory就是我们通常意义上讲的RAM、ROM、Flash等等;
所谓Normal,就是对于该地址的访问不会造成副作用,例如重复读取Flash某个位置的数据,只会返回数据,并不会造成数据修改。
因此,为了提高运行性能,CPU可以针对normal memory进行一些优化操作,比如执行预测访问:在软件发起请求操作之前,CPU就已经预取了normal memory的Data、Code,以加快访问速度;再比如访问的再排序,以生成更高效率的总线访问。
Normal Memoy可以增加Cache的属性,以加快系统运行速率、减少功耗;但是Cache的属性(例如Write-back\Write-Through、Size)会对使用者造成一些误解,因此需要谨慎使用。
2.2 Device Memory
在Armv8里,Device Memory用来描述外设;这类型的memory与刚才聊到的Normal memory最大区别在于:对Device Memory的访问可能会产生副作用。
例如,我们读取一个FIFO通常会导致内部指针指向下一块数据,访问FIFO的次数就尤为重要,所以告诉CPU当前Device Memory的属性非常关键。
首先,Cacheable肯定是不可接受的,简单例子,我们访问寄存器肯定是直接访问了,不需要cache;
其次,数据预测访问理论上应该是不允许的,以上面的读取FIFO为例,软件肯定是希望获取到完整数据;
最后,Device Memory不应该进行取指运行,值得注意的是,如果memory是Device属性,它仅仅只是针对数据预测访问,只有把其设置Not executable才能预防指令预测访问。
接下来就是我一直比较困惑的Device子属性--GRE。
2.2.1 Gathering
在Armv8手册里详细描述了Gathering的用法:
- 对同一内存位置的相同类型的多个内存访问(读或写)将合并到单个transaction中;
- 同一类型的对个内存访问到不同内存位置,将在一个interconnect里合并成一个transaction;
震惊,完全不知道在说什么。后来多方询问,可以从汇编角度进行看,如下图:
在Gathering属性加持加,把r1的值存储到r4所指定地址,并在r4 = r4所指地址+4,这四个操作可以合并为一次传输给到目标memory,从而减少传输过程中的时间损耗;这种感觉就很像诊断里流控+连续帧的用法。
2.2.2 Reordering
Reordering可以重新对传输事务进行排序,这就和normal memory的reorder比较类似,目的是为了生成更高效率的访问传输。
2.2.3 Early Write Acknowledgement
当Device配置该属性后,就意味着Core向外设发起的写访问,可以有中间buffer进行响应,如下图所示:
当Device没有该属性时,只能由外设进行写确认的response。
我们看到的nGnRnE,其实就是not-Gathering、not-Reordering、not-Early。
因此,Device Memory的属性可有如下配置:
- Device_GRE:允许gathering, re-ordering, and early write acknowledgement;
- Device_nGnRnE:不允许gathering, re-ordering, and early write acknowledgement;
- Device_nGnRE:不允许gathering, re-ordering,允许early write acknowledgement
- ......
3.小结
经上面简单总结,我们了解到了在Armv8架构下内存模型分类:Normal和Device;针对Device的子属性包含了gathering, re-ordering和early write acknowledgement,以及对应限制。后续我们继续找一颗R52内核MCU来看看Normal memory和Device memory具体是如何分配的。