1.8 Cortex-A9存储系统
ARM存储系统有非常灵活的体系结构,可以适应不同的嵌入式应用系统的需要。ARM存储器系统可以使用简单的平板式地址映射机制(就像一些简单的单片机一样,地址空间的分配方式是固定的,系统中各部分都使用物理地址),也可以使用其他技术提供功能更为强大的存储系统。
(1)系统可能提供多种类型的存储器件,如Flash、ROM、SRAM等。
(2)Cache技术。
(3)写缓存技术(Write Buffers)。
(4)虚拟内存和I/O地址映射技术。
大多数的系统通过下面的方法之一可实现对复杂存储系统的管理。
(1)使用Cache,缩小处理器和存储系统速度差别,从而提高系统的整体性能。
(2)使用内存映射技术实现虚拟空间到物理空间的映射。这种映射机制对嵌入式系统非常重要。通常嵌入式系统程序存放在ROM/Flash中,这样系统断电后程序能够得到保存。但是,通常ROM/Flash与SDRAM相比,速度慢很多,而且基于ARM的嵌入式系统中通常把异常中断向量表放在RAM中。利用内存映射机制可以满足这种需要。在系统加电时,将ROM/Flash映射为地址0,这样可以进行一些初始化处理;当这些初始化处理完成后将SDRAM映射为地址0,并把系统程序加载到SDRAM中运行,这样可很好地满足嵌入式系统的需要。
(3)引入存储保护机制,增强系统的安全性。
(4)引入一些机制保证将I/O操作映射成内存操作后,各种I/O操作能够得到正确的结果。在简单存储系统中,不存在这样的问题。而当系统引入了Cache和write buffer后,就需要一些特别的措施。
在ARM系统中,要实现对存储系统的管理通常使用协处理器CP15,它通常也被称为系统控制协处理器(System Control Coprocessor)。
ARM的存储器系统是由多级构成的,可以分为内核级、芯片级、板卡级和外设级。图1-3所示为存储器的层次结构。
图1-3 存储器的层次结构
每级都有特定的存储介质,下面对比各级系统中特定存储介质的存储性能。
(1)内核级的寄存器。处理器寄存器组可看作是存储器层次的顶层。这些寄存器被集成在处理器内核中,在系统中提供最快的存储器访问。典型的ARM处理器有多个32位寄存器,其访问时间为ns量级。
(2)芯片级的紧耦合存储器(TCM)是为弥补Cache访问的不确定性增加的存储器。TCM是一种快速SDRAM,它紧挨内核,并且保证取指和数据操作的时钟周期数,这一点对一些要求确定行为的实时算法是很重要的。TCM位于存储器地址映射中,可作为快速存储器来访问。
(3)芯片级的片上Cache存储器的容量在8KB~32KB,访问时间大约为10ns。高性能的ARM结构中,可能存在第二级片外Cache,容量为几百KB,访问时间为几十ns。
(4)板卡级的DRAM。主存储器可能是几MB到几十MB的动态存储器,访问时间大约为100ns。
(5)外设级的后援存储器,通常是硬盘,可能从几百MB到几个GB,访问时间为几十ms。
1.8.1 协处理器(CP15)
ARM处理器支持16个协处理器。在程序执行过程中,每个协处理器忽略属于ARM处理器和其他协处理器的指令。当一个协处理器硬件不能执行属于它的协处理器指令时,将产生一个未定义指令异常中断,在该异常中断处理程序中,可以通过软件模拟该硬件操作。例如,如果系统不包含向量浮点运算器,则可以选择浮点运算软件模拟包来支持向量浮点运算。CP15即通常所说的系统控制协处理器(System Control Coprocessor),它负责完成大部分的存储系统管理。除了CP15外,在具体的各种存储管理机制中可能还会用到其他一些技术,如在MMU中除了CP15外,还使用了页表技术等。
在一些没有标准存储管理的系统中,CP15是不存在的。在这种情况下,针对CP15的操作指令将被视为未定义指令,指令的执行结果不可预知。
CP15包含16个32位寄存器,其编号为0~15。实际上对于某些编号的寄存器可能对应多个物理寄存器,在指令中指定特定的标志位来区分这些物理寄存器。这种机制有些类似于ARM中的寄存器,当处于不同的处理器模式时,某些相同编号的寄存器对应于不同的物理寄存器。
CP15中的寄存器可能是只读的,也可能是只写的,还有一些是可读/可写的。在对协处理器寄存器进行操作时,需要注意以下几个问题。
(1)寄存器的访问类型(只读/只写/可读可写)。
(2)不同的访问引发不同的功能。
(3)相同编号的寄存器是否对应不同的物理寄存器。
(4)寄存器的具体作用。
1.8.2 存储管理单元(MMU)
在创建多任务嵌入式系统时,最好用一个简单的方式来编写、装载及运行各自独立的任务。目前大多数的嵌入式系统不再使用自己定制的控制系统,而使用操作系统来简化这个过程。较高级的操作系统采用基于硬件的存储管理单元(MMU)来实现上述操作。
MMU 提供的一个关键服务是使各个任务作为各自独立的程序在自己的私有存储空间中运行。在带MMU的操作系统控制下,运行的任务无须知道其他与之无关的任务的存储需求情况,这就简化了各个任务的设计。
MMU提供了一些资源以允许使用虚拟存储器(将系统物理存储器重新编址,可将其看成一个独立于系统物理存储器的存储空间)。MMU作为转换器,将程序和数据的虚拟地址(编译时的连接地址)转换成实际的物理地址,即在物理主存中的地址。这个转换过程允许运行的多个程序使用相同的虚拟地址,而各自存储在物理存储器的不同位置。
这样存储器就有两种类型的地址:虚拟地址和物理地址。虚拟地址由编译器和连接器在定位程序时分配;物理地址用来访问实际的主存硬件模块(物理上程序存在的区域)。
1.8.3 高速缓冲存储器(Cache)
Cache 是一个容量小但存取速度非常快的存储器,它保存最近用到的存储器数据副本。对于程序员来说,Cache是透明的。它自动决定保存哪些数据、覆盖哪些数据。现在Cache通常与处理器在同一芯片上实现。Cache 能够发挥作用是因为程序具有局部性。所谓局部性就是指在任何特定的时间,处理器趋于对相同区域的数据(如堆栈)多次执行相同的指令(如循环)。
Cache经常与写缓存器(write buffer)一起使用。写缓存器是一个非常小的先进先出(FIFO)存储器,位于处理器核与主存之间。使用写缓存的目的是,将处理器核和Cache从较慢的主存写操作中解脱出来。当CPU向主存储器做写入操作时,它先将数据写入到写缓存区中,由于写缓存器的速度很高,这种写入操作的速度也将很高。写缓存区在CPU空闲时,以较低的速度将数据写入到主存储器中相应的位置。
通过引入Cache和写缓存区,存储系统的性能得到了很大的提高,但同时也带来了一些问题。例如,由于数据将存在于系统中不同的物理位置,故可能造成数据的不一致性;由于写缓存区的优化作用,故可能有些写操作的执行顺序不是用户期望的顺序,从而造成操作错误。