内存系列学习(七):ARM处理器的快速上下文切换技术

简介: 内存系列学习(七):ARM处理器的快速上下文切换技术

1 FCSE概述

FCSE(Fast Context Switch Extension,快速上下文切换)位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间,则对CPU而言,两个进程使用了同样的虚拟地址空间。

**快速上下文切换机构对各进程的虚拟地址进行变换,**这样系统中除了CPU之外的部分看到的是经过快速上下文切换机构变换的虚拟地址。快速上下文切换机构将各进程的虚拟空间变换成不同的虚拟空间,这样在进行进程间切换时就不需要进行虚拟地址到物理地址的重映射。

快速上下文切换(FCSE)通过修改系统中不同进程的虚拟地址,避免在进行进程间切换时造成的虚拟地址到物理地址的重映射,这样就减少了重建MMU、使cache和TLB无效、重建cache和TLB内容等操作的巨大开销,从而提高系统的性能。

快速上下文切换扩展(FCSE)修改ARM内存系统的行为。这种修改允许在ARM处理器上运行的多个程序使用相同的地址范围,同时确保它们提供给内存系统其他部分的地址不同。

2 FCSE原理

在ARM系统中,4GB的虚拟空间被分成128个进程空间块,每个进程空间块大小为32MB。

每个进程空间块中可以包含一个进程,该进程可以使用虚拟地址空间0x00000000~0x01ffffff,这个地址范围也就是CPU看到的进程的虚拟空间。

系统128个进程空间块的编号为0~127,

编号为 I的进程空间块中的进程实际使用的虚拟地址空间为 I0x02000000到 I0x02000000+0x01ffffff,这个地址空间是系统中除了CPU之外的其他部分看到的该进程所占用的虚拟地址空间。

快速上下文切换机构将CPU发出的每个虚拟地址按照上述的规则进行变换,然后发送到系统中的其他部分,变换过程如图所示。

图中地址VA到MVA的变换算法如下:

if (VA[31:25] == 0b0000000) then
            MVA = VA | (PID <<25)
        else
            MVA = VA

如果VA[31:25]不等于0,说明地址VA是本进程用于访问其他进程中的数据和指令的虚拟地址,此时被访问进程的PID不能为0。

相反如果VA[31:25]等于0,说明要访问的地址VA在该进程自身地址空间内,所以要进行进程上下文切换,将VA转换成MVA,其中上面公式中的PID是该进程的PID号。

3 FCSE编程接口

ARM处理器用CP15协处理器的C13寄存器来实现FCSE功能。

当要进行进程切换时,首先清空写缓存,再把新进程的页表地址写入CP15的C2寄存器,然后把新进程的PID号写入CP15的C13寄存器的最高7位即可。

如果处理器不支持FCSE功能,那么使cache和TLBs无效,然后系统要重建cache和TLBs。下面我们比较一下XScale处理器以及ARMv6处理器中进程切换中的内存切换操作函数的区别:

XScale处理器进程切换中的内存切换操作函数如下所示:

.align   5
        ENTRY(cpu_xscale_switch_mm)
          clean_d_cache r1, r2;使r1所指地址到r2所指地址之间数据cache无效
          mcr  p15, 0, ip, c7, c5, 0;使系统全部指令cache无效
          mcr  p15, 0, ip, c7, c10, 4;清空写缓存Write Buffer
          mcr  p15, 0, r0, c2, c0, 0;装入新的页表地址
          mcr  p15, 0, ip, c8, c7, 0;使系统全部数据和指令TLBs cache无效
          cpwait_ret lr, ip;返回

ARMv6处理器进程切换中的内存切换操作函数如下所示:

ENTRY(cpu_v6_switch_mm)
          mov  r2, #0
          ldr  r1, [r1, #MM_CONTEXT_ID];获取新进程的PID号,该PID号其实就是新进程的
    struct mm_struct结构中的mm_context_t成员结构context的id
          mcr  p15, 0, r2, c7, c10, 4;清空写缓存Write Buffer
      mcr  p15, 0, r0, c2, c0, 0   ;装入新的页表地址
      mcr  p15, 0, r1, c13, c0, 1;设置上下文PID号
      mov  pc, lr;返回

在ARM处理器中只有ARMv6以上版本的处理器才支持FCSE功能。

小结

通常,在VMSA[虚拟内存系统架构]实现中,地址范围重叠的两个软件进程之间的交换需要对MMU转换表定义的虚拟到物理地址映射进行更改,请参阅短描述符转换表格式。

在ARMv6之前,这通常也会导致缓存和TLB内容变得无效,因为它们与旧的虚拟到物理地址映射有关,因此需要刷新缓存和TLB。

因此,每个进程交换都有相当大的开销,这既直接是因为更改转换表的成本,也间接是因为随后重新加载缓存和TLB的成本。

通过为不同的软件进程向存储器系统的其余部分提供不同的地址,即使它们使用相同的地址,FCSE也避免了这种开销。

它还允许软件进程使用相同的地址范围,即使内存系统的其余部分不支持虚拟到物理地址映射。

ARMv6消除了此类过程交换的维护和随后的重新加载开销,有效地消除了FCSE的好处。

因此,从ARMv6开始,ARM就反对使用FCSE机制。FCSE在ARMv7中是可选的,而ARMv7多处理器扩展程序淘汰了FCSE。

在VMSA实现中,FCSE转换是存储器访问序列的第一阶段。

也就是说,处理器在开始“About address translation”中总结的地址转换之前执行FCSE转换。

FCSE将处理器提供的虚拟地址(VA)转换为修改虚拟地址(MVA)。

  • 从ARMv6开始,ARM反对使用FCSE机制。FCSE在ARMv7中是可选的,而ARMv7多处理器扩展程序淘汰了FCSE。
  • 同时使用FCSE和基于ASID的内存属性会导致不可预测的行为。必须清除FCSE,或者将所有内存声明为全局内存。

参考资料

  • 《嵌入式开发》
  • 基于快速上下文切换扩展的快速地址空间切换
目录
相关文章
|
2月前
|
KVM 虚拟化
KVM的热添加技术之内存
文章介绍了KVM虚拟化技术中如何通过命令行调整虚拟机内存配置,包括调小和调大内存的步骤,以及一些相关的注意事项。
73 4
KVM的热添加技术之内存
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
60 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
ARM64技术 —— 系统调用指令SVC、HVC和SMC的使用规则
ARM64技术 —— 系统调用指令SVC、HVC和SMC的使用规则
|
2月前
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
ARM64技术 —— MMU处于关闭状态时,内存访问是怎样的?
|
2月前
|
Ubuntu KVM 虚拟化
基于ARM64的Qemu/KVM学习环境搭建
基于ARM64的Qemu/KVM学习环境搭建
|
3月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
34 3
|
2月前
ARM技术 —— 条件执行
ARM技术 —— 条件执行
|
2月前
ARM64技术 —— Device Memory Type
ARM64技术 —— Device Memory Type
|
2月前
|
NoSQL Ubuntu Linux
基于ARM64的Qemu/KVM学习环境搭建2
基于ARM64的Qemu/KVM学习环境搭建2