Bootstrap

[A-18]ARMv8/ARMv9-Memory-内存空间的属性(Attributes & Properties)

ver0.1
[看前序文章有惊喜,关注“浩瀚架构师”,可以解锁全部文章]

前言

在宏伟的ARM的内存世界中VMSA中,属性这个议题算不上最亮的星,就和屏幕前的你和我一样,平凡的活在这个茫茫然的人世间。纵使“丈夫贫践应未足,今日相逢无酒钱。”,也不要灰心面对生活,因为“山重水复疑无路,柳暗花明又一村”。这个时代磨炼着每一个人,考验着每一个人的意志力,只要坚持走下去,“莫愁前路无知己,天下谁人不识君”。本文成文的早晨,发生了一些遗憾的事情,谨以此文激励一下每一个屏幕前奋斗的码农,每一个为家庭默默付出的人。内存的属性虽然平凡,但是仍然足够重要,因为它们是构成这个VMSA系统一些特征的基石,前面的文章我们也穿插讨论了一些,例如内存的类型、内存的共享属性等等,本文我们会对其他一些内存属性进行讨论。

正文

内存的属性其实不太准确,准确的说法应该是内存空间的属性。前面的文章我们已经了解到了,CPU是工作在虚拟地址空间的,它要访问物理地址空间的时候需要依赖MMU做一下翻译的工作。而整个的SOC系统也是通过内存空间组织在一起的,不管是数据的交互、还是CPU指令的发出都要依赖内存空间。内存空间基本分类就是device和Normal,它们就工作在不同的业务场景下。直观的体现就是表现出来的行为就不一样,一个外设的寄存器会被映射在设备类型空间,那么它肯定是不希望被cache的,因为它的值随时都可能被改变,但是它又没有好的机制保证和CPU看到的数据的一致性。Normal类型的数据为了能够减少访问外存的时钟周期,多数是要被缓存的,而且CPU在出厂的时候,会有完整的Cache一致性机制和替换策略保证数据的一致性。类似种种情况,结合ARM的架构,都需要对内存空间做进一步的细分,应用层的OS或者Firmware在申请内存的时候,顺便把内存的属性填充好,这样CPU工作的时候让小弟遍历这些属性就能准确的控制整个系统的行为。检查通过,就继续工作,检查失败就抛异常,启动异常处理机制进行“惩罚”。既然属性是内存空间的属性,那么首先就要对内存空间有起码的了解。

1.1 内存空间

我们前面有一篇专门的文章讨论过内存空间:[A-09]ARMv8/ARMv9-Memory-内存空间(Address Spaces and Translation Regimes),还没有看过的伙伴可以先过去看一下。我们这里带大家简单回顾一下到底啥是内存空间(如果对这一节比较熟悉,可以直接跳过)。
ARM的体系下构建了一个虚拟的内存世界:AArch64 Virtual Memory System Architecture (VMSA)。顾名思义,ARM的内存世界是一个虚拟的世界,ARM通过编译器所有在上面运行的软件都编上了一个统一的地址。软件代码在编译和执行的过程中,看到的也都是虚拟的地址。单CPU拿到一个虚拟地址后,他需要做的一件事情就是要把这个虚拟的地址VA分配一个真实的物理PA地址与之对应,这样整个VMSA架构体系就运转了起来。
随着操作系统的发展,以及在工程实践中的经验积累,人们发现计算机的世界需要等级、需要调控。不然就会产生混乱,比如系统上就一个喇叭能发声,A应用想发声,B应用也想发声,怎么办?得有更高权限的模块处理这些事务,并定下规则,于是ARM的异常模型诞生了,如图1-1所示。
1-1

图1-1 ARM异常等级

关于异常模型可以参考前序文章: [V-05] 虚拟化基础-异常模型(Exception model)(基于AArch64) 这里不展开做详细讨论了。
异常的等级越高,权限越大,其实就是控制资源的权限越高。计算机的世界在有了秩序之后玩命的卷了起来,不管是虚拟化技术、操作系统技术、还有各种各样的应用技术都在飞快的发展。伴随着欣欣向荣的景象,另外一些需求也随之产生,那就是安全。和现实的世界一样,总有一些心怀叵测的人通过各种手段窥伺别人的隐私信息,比如一个公钥、一个证书、或者一个生物(指纹)信息。安全无小事,ARM架构在迭代的过程中也引入了安全状态,也开始了对ARM世界的第二次跑马圈地。
1-2

图1-2 安全状态

“星星还是那个星星,月亮还是那个月亮”,CPU还是那个CPU,内存还是那个内存。如果这个世界一直就是这样的话,怎么能表现Non-Secure安全状态下Hypervisor的地位、怎么表现出Secure状态下Trusted OS的身份…。ARM的架构下就是靠内存世界的划分加以区别,也就是CPU还是那个CPU,但是内存却不是那个内存了,因为ARM把虚拟内存的空间做了细分。

The architecture defines all of the following translation regimes:
• Non-secure EL1&0 translation regime.
• Secure EL1&0 translation regime.
• Realm EL1&0 translation regime.
• Non-secure EL2&0 translation regime.
• Secure EL2&a

;