[A-16]ARMv8/ARMv9-Memory-内存共享属性和内存一致性(Memory Shareability & Consistency)
ver0.2
[看前序文章有惊喜,关注“浩瀚架构师”,可以解锁全部文章]
前言
前文我们详细的叙述了内存世界的无形之手是如何将整个ARM的系统的执行效率推升到极致,但是伴随着ARM架构的这些优化的策略执行在特定的场景下也会造成内存世界的重排序,而重排序会给应用层的编程带来一定的不确定性。从ARM架构的角度看过去,造成这种不确定的一个重要的原因就是ARM的内存模型中是支持内存共享的属性(Memory Shareability),PE-Core之间可以共享同一段内存,总线架构下各个Master之间也可以共享一段内存。当一个SOC在运行时,如果想让各个节点(Master)始终工作在正确的状态,那就需要使他们看到的内存内容是一样的状态,这就是内存的一致性(Memory Consistency)。这里声明一下,前文中说好的那只有形的手-内存屏障不会鸽的,只是在写屏障的时候,觉得内存的一致性课题挺有意思的,很多地方值得研究,所以独立一篇成文。
正文
在前面的文章中,我们已经研究过Cache的一致性: [A-06] ARMv8/ARMv9-Cache的一致性机制(Cache系列完结篇),相信度过那篇文章的伙伴理解内存一致性应该不会困难。Cache缓存的就是内存里面的内存,因此Cache的一致性其实是内存一致性的一个子集,我们今天研究的范围更加宏观一些那就是内存一致性。而内存一致性课题的由来就是内存的共享属性,因此有必要先花一点时间来介绍一下它。
1.1 内存的共享(Shareability)属性
读过前序文章内存多级页表架构和页表描述符: [A-12]ARMv8/ARMv9-Memory-页表描述符(Translation table descriptor)
的伙伴应该知道,ARM通过页表描述内存的属性,而这些属性中有一个属性就是Shareability,如图1-1所示。
通过页表描述符我们可以看到ARM使用SH[1:0]两个位来描述这一块内存的共享属性,那么这两个bit能具体产生哪些配置呢,如图1-2所示。
这里面需要注意的是内存的不同属性之间是有一定的关联性的,比如我们今天说到的共享属性就和内存类型(Normal or Device)和内存的Cache性就有关联,这里我们简单归纳一下:
(1) 对于属于Normal类型且可以缓存的内存来说,这段区域可以指定为图1-2中的任意一种类型。
(2) 而对于经过所有阶段合并转换后类型为设备类型或者是Normal的且不可Cache的内存,那么这段内存区域则会被系统赋予Outer Shareable的内存。
到这里内存的共享属性似乎就介绍完了,原来好简单啊,就两个标志位组合一下,最多也就四个选项。似乎是这样的,但是其实并非如此,我们来思考几个问题:
(1) 既然是共享属性,到底是谁和谁在共享;
(2) 共享的内存被更新之后,是如何通知到其他共享者的?
(3) 学习过前文页表架构的我们都知道,页表不光是分级的而且是分阶段的,图1-2中只列出了Stage-1阶段,那么Stage-2阶段又是什么情况?
本文我们先来回答问题(1)(2),问题(3)涉及到虚拟化课题,我们会单独成文来叙述。
1.2 Domains
本节先来回答第一个问题,到底都谁参与了共享。我们在前面文章中反复提到了总线架构,这里我们不展开讨论了,感兴趣的伙伴可以自行阅读。这里我们简单回顾一下,现代处理出货的时候早已经不是单打独自战
原文地址:https://blog.csdn.net/timyu007/article/details/143235422
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!