4.1 概述

本章主要包含以下内容:

  • ARM中的系统控制协处理器CP15
  • ARM中的存储管理部件MMU
  • ARM中cache及write buffer技术
  • 快速进程上下文切换技术

4.2 ARM中的系统控制协处理器CP15

在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。CP15有16个32位的寄存器,下表介绍了这些寄存器的一般作用,和在MMU中的作用。

寄存器编号 基本作用 在MMU中的作用
0 ID编码 ID编码和cache类型
1 控制位(可读可写) 各种控制位
2 储存保护和控制 页表基地址
3 储存保护和控制 域访问控制位
4 储存保护和控制 保留
5 储存保护和控制 内存失效状态
6 储存保护和控制 内存失效地址
7 高速缓存和写缓存 高速缓存和写缓存控制
8 存储保护和控制 TLB控制
9 高速缓存和写缓存 告诉缓存锁定
10 存储保护和控制 TLB锁定
11 保留
12 保留
13 进程标识符 进程标识符
14 保留
15 因设计而异 因设计而异

4.3 存储管理单元MMU

4.3.1 存储管理单元MMU概述

在ARM系统中,存储管理单元MMU主要完成以下工作:

  • 虚拟地址空间到物理地址空间映射。
  • 存储器访问权限的控制。
  • 设置虚拟存储空间的缓冲的特性。

分页机制是实现上述功能的方式。在ARM中采用了页式虚拟存储管理,把虚拟地址空间分成一个个固定大小的块.每一块称为页,把物理内存的地址空间也分成同样大小的页。MMU就要 实现从虚拟地址到物理地址的转换。

页表存放在内存中,系统通常有一个寄存器来保存页表的基地址。在ARM中系统控制协处理器CP15的寄存器C2用来保存页表的基地址。从虚拟她址到物理地址的变换过程其实就是查询页表的过程,由于贞表存放在内存中,这个查询过程通常代价根大。而程序在执行过程中具有局部性,因此,对页表中各存储器的访问井不是完全随机的。也就是说,在一段时间内,对页表的访问只是局限在少数 几个单元中。根据这一特点,采用个容量更小(通常为8一16个字、访问速度和CPU中通用寄存器相当的存储器件来存放当前访问需要的地址变换条目。这个小容量的页表称为快表TLB。

当CPU需要访问内存时,先在TLB中查找需要的地址变换条目。如果该条目不存在,CPU从位于内存中的页表中直询,并把相应的结果添加到TLB中。这样当CPU下次又需要该地址变换条目时,可以从TLB中直接得到,从而使地址变换的速度大大加快。

当内存中的页表内容改变,或者通过修改系统控制协处理器CPI5的寄存器C2使用新的页表时,TLB中的内容需要全部消除。MMU提供了相关的硬件支特这种操作。系统控制协处理器CPI5的寄存器C8用来控制清除TLB内容的相关操作。

MMU可以将某些地址变换条目锁定在TLB中,从而使得进行与该地址变换条目相关的地址变换速度保持很快。在MMU中寄存器C10用于控制TLB内容的锁定。

MMU可以将整个存储空间分为最多16个域,每个域对应一定的内存区域,该区域具有相同的访问控制属性。 MMU中寄存器C3用于控制与域相关的属性的配置。

当存储访问失效时,MMU提供了相应的机制用于处理这种隋况。在MMU中寄存器 C5和寄存器C6用于支特这些机制.

与MMU操作相关的寄存器如表所示:

寄存器 作用
C1 用于配置MMU中一些操作
C2 保存页表基地址
C3 设置域的访问控制属性
C4 保留
C5 内存访问失效状态指示
C6 内存访问失效状态地址
C8 控制与清除TLB内容相关的操作
C10 控制与锁定TLB内容相关的操作

4.3.2 MMU中的地址变换过程

前面己经介绍过虚拟存储空间到物理存储空间的映射是以内存块为单位进行的。即 虚拟存储空间中一块连续的存堵空间彼映射成物理存储空间中同样大小的一块连续存储空间。在页表中(TLB中也是一样的)每一个地址变换条目实际上记录了一个虚拟存储空的存储块的基地址与物理存储空间相应的个存储块的基地址的对应关系。恨据存储块大 小可以有多种地址交换。

ARM支持的存储块大小有以下几种:

  • 段: 大小为1M
  • 大页: 大小为64KB的存储块
  • 小页: 大小为4KB的存储块
  • 极小页: 大小为1KB的存储页

通过采用另外的访问控制机制,还可以将大页分成大小为16 KB的子页;将小页分 成大小为1 KB的子页;极小页不能再细分,只能以1KB大小的整页为单位。

在MMU中采用下面两级页表实现上述地址映射。 一级页表中包含有以段为单位的地址变换条目以及指向二级页表的指针。一级页表实现的地址映射粒度较大。 二级页表中包含以大页和小页为单位的地址变换条目。其中,一种类型的二级页表还包含有以极小页为单位的地址变换条目。 通常,以段为单位的地址变换过程只需要一级页表。而以页为单位的地址变换过程还 需要二级页表。卜面介绍这些地址变换过程。

基于一级页表的地址变换过程 基于一级页表的地址变换过程。 这里将只涉及一级页表的地址变换过程称为一级地址变换过程。级地址变换过 程如图5.3所示。CP15的寄存器C2中存放的是内存中页表的基地址。其中位 [31:14]为内存中页表的基地址,位[13:0]为0。因此级页表的基地址必须是16KB对齐的。CPI5的寄存器C2的位[31:14]和虚拟地址的位[31:20]结合作为一个32位数的高30位,为蒋该32位数的低两位值为00,从而形成一个32位的索引值。使用该32位的索引值从页表中可以查到一个4字节的地址变换条目。该条目中或者包含了一个一级描述符,或者包含了一个指向二级页表的指针。

根据上面的过程可以得到页表中相应的地址变换条目。该条目称为一级描述符。一级描述符定义了与之相应的1M存储空间是如何映射的。一级描述符的位[1::0]定义了该一级描述符的类型,共有下面4种格式的一级描述符:

如果位[1:0]为0b00,相应的1MB虚拟存储空间没用被映射到物理存储空间,因而访问该存储空间将产生地址变换失效信号。MMU硬件没有使用位[31:2],软件可以使用它。 如果位[1:0]为0b10,该一级描述符为段描述符,段描述符定义了对应的1 MB的虚拟存储空间的地址映射关系。

4.3.3 MMU中存储访问权限控制

在MMU中,寄存器C1的R、S控制位和页表中地址转换条件中的访问权限控制位联合作用控制存储访问的权限。具体规则如表所示:

AP S R 特权级时访问权限 用户级时访问权限
0b00 0 0 没有访问权限 没有访问权限
0b00 1 0 只读 没有访问权限
0b00 0 1 只读 只读
0b00 1 1 不可预知 不可预知
0b01 x x 读写 没有访问权限
0b10 x x 读写 只读
0b11 x x 读写 读写

4.4 高速缓冲存储器和写缓冲区

通常ARM处理器的主频为几十MHz,有的已经达到200MHz。而一般的主存储器操用动态存储器(DRAM),其存储周期仅为100ns-200ns。这样,如果指令和数据都存放在主存储器中,主存储器的速度将会严重制约整个系统的性能。高速缓冲存储器(Cache)和 写缓冲区(cache baffers)位于主存储器和CPU之间,主要用来提高存褚系统的性能。本节主要介绍这与两种技术相关的基本概念。

4.4.1基本概念

高速缓冲存储器是全部用硬件来实现的,因此,它不仅对应用程序员是透明的而且 对系统程序员也是透明的。Cache与主存储器之间以块(cache line)为单位进行数据交换。当Cpu读取数据或者指令时,它同时将读取到的数据或者指令保存到一个cache块中,该样当CPU第2次需要读取相同的数据时,它可以从相应的cache块中得到相应的数据。因为cache的速度远远大于主存储器的速度,系统的整休性能载得到很大的提高。实际上在程序中通常相邻的一段时间内Cpu访问相同数据的概率是很大的这种规律称为时间局部性。时间局部性保证了系统采用cache后通常性能都能得到很大的提高。

不同系统中,cache的块大小也是不同的,通常cache的块大小为几个字。这样当CPU从主存储器中读取一个宇的数据时,它将会把主存储器中和cache块同样大小的数据读取到cache的一个块中。比如,如果cache的块大小为4个字,当CPU从主存储器中读取地址为n的字数据时,它同时将地址为n、n+1、n十2、n+3的4个字的数据读取到 cache中的一个块中。这样,当CPU需要读取地址为n+1、n+2或者n十3的数据时,它可以从cache中得到该数据,系统的性能将得到很大的提高。实际上,在程序中CPU访问相邻的存储空间的数据的概率是很大的,这种规律称为空间局部性。空间局部性保证了系统采用cache后通常胜能都能得到很大的提高。

写缓冲区是由一些高速的存储器构成的。它主要用来优化向主存储器中的写入操作。当CPU进行向主存储器中的写入操作时,它先将数据写入到写缓冲区中,由于写缓冲区的访问速度很高,这种写入操作的速度将很高。然后CPU就可以进行下面的操作。写缓冲区在适当的时候以较低的速度将数据写入的主存储器中相应的位置。

通过引入cache和写缓冲区,存储系统的性能得到了很大的提高,但同时也带来了一 些问题。比如由于致据将存在于系统中不同的物理位置可能造成数据的不一致性:由于写缓冲区的优化作用可能有些写操作的执行的顺序不是用户期望的顺序,从而造成操作错误。

4.4.2 cache的工作原理和地址映像方法

本小节介绍cache的基本工作原理以及cache中常用的3种地址映射方法.

I. cache的工作原理

在cache存储系统中,把cache和主存储器都划分成相同大小的块。因此主存地址 可以由块号B和块内地址W两部分组成。同样cache的地址也可以由块号b和块内地址 w组成。

当CPU要访问cache时,CPU送来主存地址,放到主存地址寄存器中。通过地址变换部件把主存地址中的块号B变换成cache的块号b,并放到cachc地址寄存器中。同时,将主存地址中的块内地址w直接作为cache的块内地址w装入到cache地址寄存器中。如果变换成功〔称为cache命中)就用得到的cache地址去访问cache,从cache中取出数据送到CPU中。如果变换不成功则产生cache失效信息井且用主存地址访问主存储器。从主存储器中读出一个字送往CPU,同时,把包含被访问字在内的一整块都从主存储器读出来,装入到cache中去。这时如果cache己经满了,则要采用某种cache替换策略把不常用的块先调出到主存储中相应的块中,以便腾出空间来存放新调入的块。由于程序具有局部性特点,每次块失效时都把一块〔由多个字组成)调入到cache中能够提高 cache的命中率。

通常cache的容量比较小,主存储器的容量要比它大得多。那么cache中的块与主存储器中的块是按照什么样的规则建立对应关系的呢?在这种对应关系下,主存地址又是如何变换成cache地址的呢?

II. cache地址映像和变换方法

在cache中,地址映像是指把主存地址空间映像到cache地址空间,具体说,就是把存放在主存中的程序按照某种规则装入到cache中,并建立主存地址到cache地址之间的对应关系。而地址变涣是指当程序己经装入到cache后,在实际运行过程中,把主存地址如何变换成cache地址。

地址的映像和变换是密切相关的。采用什么样的地址映射方法就必然有与这种映像 方法相对应的地址变换方法。

无论采用什么样的地址映像方式和地址变换方式,都要把主存和cache划分成同样大 小的存储单位,每个存储单位称为块,在进行地址映像和变换时,都是以块为单位进行调度。

常用的址映像方式和变换方式包括全相联映像和变换方式,直接映像和变换方式及组相联映像和变换方式。

全相联映像方式 在全相联映像方式中主存中,任意一块可以映射到c朋比中的任意一块的位置 上,如果cache的块容量为Cb,主存的块容量为Mb,则主存和cache之间的映像关系共有Cb*Mb种。如果采用日录表来存放这些映像关系,则目录表的容量为Cb。

直接映像方式 直接映像是一种最简单,也是最直接的方法.主存中一块只能映像到cache中的一个特定的块中。假设主存的块号为B,cache的块号为b,则它们之间的映像 关系可以用下面的公式标识: b=B mode Cb 其中,Cb为cache的块容量。

织相联映像方式 在组相联的地址映像和变换方式中,把主存和cache按同样大小划分成组(set),每一个组都由相同的块数组成。由于主存储器的容量比Cache的容量大得多,因此,主存的组数要比cache的组数多。从主存的组到cache的组之间采用直接映像方式在主存中的组与 cache中的一组之间建立了直接映像关东之后,在两个对应的组内部采用全相联映像方式。

在ARM中采用的是组相联的地址映像和交换方式。如果cache的块大小为2的L次方,则同一块中的各地址中的位[33:L]是相同的。如果cache中组的大小(每组中包含的块数)为2的S次方,则虚拟地址中的位[S+L-1 : L]用于选择cache中的某个组。虚拟地址中共他位[31:L十S] 别包含了些标志位。

这里将cache每组中的块数称为组容量。上述的3种映像方式即对应了不同的组容量。当组容量为cache中的块数时,对应的映像方式即为全相联映像方式; 当组容量为1时对应的映像力式即为直接映像方式:组容量为其他值时,通常称为组相联映像方式。

在组相联映像方式中cache的大小CACHE_SIZE(字节数)可以通过下面的公式来计算。 CACHE_SIZE = LINELENASSOCIATIVIRYNSIZE 其中,LINELEN为cache块大小, ASSOCIATIVITY为组容量, NSETS为cache的组数。

4.5 快速上下文切换技术

快速上下文切换技术(Fast Context Switch Extension, FCSE)通过修改系统中不同进程的虚拟地址,避免在进行进程间切换时造成的虚拟地址到物理地址的重影射,从而提高系统的性能。本节介绍快速上下文切换技术的原理。

4.5.1 快速上下文切换技术原理

通常情况下,如果两个进程占用的虚拟地址空间有重叠,系统在这两个进程之间进行 切换时,必须进行虚拟地址到物理的地址的重映射。而虚拟地址到物理地址重映射涉及到 重建MMU中的页表,而且cache及TLB中的内容都必须使无效。这些操作将带来巨大 的系统开悄,一方面重建MMU和使无效cache及TLB的内容需要很大的开销,另一方 面重建cache和TLB内容也需要很大的开销。

快速上下文切换技术的引入避免了这种开销。它位于CPU和MMU之间,如 果两个进程使用了同样的虚拟地址空间,则对Cpu而言,两个进程使用了同样的虚拟地 址空间;快速上下文切换机构对各进程的虚拟地址进行变换,这样系统中除了CPU之外 的部分看到的是经过快速上下文切换机构变换的虚拟地址。快速上下文切换机构将各进释 的虚拟空间变换成不同的虚拟空间。这样在进行进程间切换时就不需要进行虚拟地址到物 理地址的重映射 。

在ARM系统中,4 GB的虚拟空间被分成了128个进程空间块,每个进程空间块大 小为32 MB。每个进程空间块中可以包含个进程,该进程可以使用虚拟地址空间 0x0000000~0x01FFFFFF,这个地址范围也就是CPU看到的进程的虚拟空间。系统128 个进程空间块的编号0一127,编号为1的进程空间块中的进程实际使用的虚拟地址空间为 (1 0x02000000)到(1 0x0200000+0x01FFFFFF),这个地址空间是系统中除了CPU之外 的其他部分着到的该进程所占用的虚拟地址空间 。

系统中每个进程都使用虚拟地址空间0x00000000-0x01FFFFFF,当进程访问本进 程的指令和数据时,它产生的为虚拟地址VA的高7位为0;快速上下文切换机构用该进 程的进程标识符代替VA的高7位,从而得到变换后的虚拟地址MVA,这个MVA在该 进程对应的进程空间块。

当VA的高7位不是全0时,MVA=VA。这种VA是本进程用于访问别的进程中的 数据和指令的虚拟地址,注意这时被访问的进程标识符不能为0。