内存系列学习(七):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,或者将所有内存声明为全局内存。

参考资料

  • 《嵌入式开发》
  • 基于快速上下文切换扩展的快速地址空间切换
目录
相关文章
|
29天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
81 0
|
1月前
|
缓存 算法 编译器
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
C/C++编译器内存优化技术:内存优化关注程序对内存的访问和使用,以提高内存访问速度和减少内存占用。
41 0
|
1月前
|
存储 机器学习/深度学习 人工智能
嵌入式中一文搞懂ARM处理器架构
嵌入式中一文搞懂ARM处理器架构
38 1
|
1月前
|
人工智能 安全 数据安全/隐私保护
叫好不叫座?Arm、英特尔、AMD 等 5 位技术大咖畅聊机密计算技术
机密计算作为一项新兴技术,为我们如何安全处理和计算敏感数据提供了新的视角和解决方案。
|
2月前
|
存储 缓存 并行计算
DP读书:鲲鹏处理器 架构与编程(四)内存顺序模型与内存屏障
DP读书:鲲鹏处理器 架构与编程(四)内存顺序模型与内存屏障
36 1
|
2月前
|
存储 缓存 物联网
DP读书:鲲鹏处理器 架构与编程(二)服务器与处理器——高性能处理器的并行组织结构、ARM处理器
DP读书:鲲鹏处理器 架构与编程(二)服务器与处理器——高性能处理器的并行组织结构、ARM处理器
251 0
|
3月前
|
存储 监控 NoSQL
【Redis深度专题】「核心技术提升」从源码角度探究Redis服务的内存使用、清理以及逐出等底层实现原理
Redis作为一种高性能的内存NoSQL数据库,其容量受限于最大内存的限制。用户在使用阿里云Redis时,除了对性能和稳定性有较高的要求外,对内存占用也非常敏感。然而,在实际使用中,一些用户可能会发现他们的线上实例的内存占用比预期的要大。
64 1
【Redis深度专题】「核心技术提升」从源码角度探究Redis服务的内存使用、清理以及逐出等底层实现原理
|
3月前
|
缓存 Linux Shell
内存系列学习(八):终章-结束又是开始
内存系列学习(八):终章-结束又是开始
38 0
|
3月前
|
存储 缓存 Linux
内存系列学习(六):ARM处理器存储访问一致性问题
内存系列学习(六):ARM处理器存储访问一致性问题
67 0
【各种问题处理】X86架构和ARM架构的区别
【1月更文挑战第13天】【各种问题处理】X86架构和ARM架构的区别

热门文章

最新文章