本文对ARM存储管理进行简要归纳,不涉及具体映射和寄存器设置。
一、MMU
内存管理部件使用内存映射技术实现虚拟空间到物理空间的映射。嵌入式系统中通常把异常中断向量表存放在RAM中。当系统加电时,将ROM/FLASH映射为地址0,这样可以进行一些初始化处理;当这些初始化处理完成后将SDRAM映射为地址0,并把系统程序加载到SDRAM中运行,这样很好的解决了嵌入式系统的需求。
ARM中,存储系统通常是通过系统控制协处理器CP15完成的。CP15包含16个32位的寄存器。
ARM中采用页式虚拟存储管理。页的大小分为粗粒度和细粒度两种。页表是实现地址转换的手段,位于内存中。
ARM支持的存储块大小有:
段:大小为1MB的存储块
大页:大小为64KB的存储块
小页:大小为4KB的存储块
极小页:大小为1KB的存储块
二、高速缓冲存储器和写缓冲区
基于时间局部性和空间局部性原理,在主存储器和CPU之间添加高速缓冲存储器(Cache)和写缓冲区(write buffer),来提高存储系统的性能。但由于数据将存在于系统中不同的物理位置,可能造成数据的不一致性,由于写缓冲区的优化作用,可能有些写操作的执行顺序不是用户期望的顺序,从而造成操作错误。
1.
写通(write-through)Cache和写回(write-back)Cache
写通:CPU在执行写操作时,必须把数据同时写入Cache和主存。
写回:CPU在执行写操作时,被写的数据只写入Cache,不写入主存。
2.
缓冲技术的注意事项:
Cache通常需要存储器件具有下面的特性:
Ø
读取操作将返回最后一次写入的内容,而且没有其他的副作用。
Ø
写操作除了影响目标单元的内容外,没有其他副作用。
Ø
对同一目标单元的两次连续读取操作将得到相同的结果。
Ø
对同一目标单元的两次连续写操作将会把第二次写操作的值写入目标单元,第一次写操作将没有意义。
在ARM中,I/O操作通常被映射成存储器操作,I/O空间与存储器空间不加区分,所以这些存储器映射的I/O空间就不满足Cache所要求的上述特性。因而对于存储器映射的I/O空间不能使用Cache技术。由于写缓冲技术可能推迟写操作,因此存储器映射的I/O空间也不能用写缓冲。将存储器映射的I/O空间设置成uncached是为了有效的防止硬件系统优化师删除掉有用的存储访问操作。如果用C语言访问存储器的I/O空间时,仅仅将存储器映射的I/O空间设置成uncached是不够的,还需要使用volatile关键字来防止编译器在优化时删掉有用的存储器访问操作。
3、
存储系统的一致性问题
1)
地址映射关系变化造成的数据不一致
l
如果数据Cache为写回类型的Cache,清空该数据Cache
l
使数据Cache中相应块无效
l
使指令Cache中相应块无效
l
将写缓冲中被延迟的写操作全部执行
l
有些情况可能还要求相关的存储区域被设置成非缓冲的
2)
DMA造成的数据不一致
l
将DMA访问的存储区域设置成非缓冲的(uncachable及unbufferable)
l
将DMA访问的存储区域所涉及的数据Cache中块设置成无效,或者清空数据Cache
l
清空写缓冲区(执行写缓冲区中延迟的所有写操作)
l
在DMA操作期间限制处理器访问DMA的存储区域。
三、快速上下文切换(FCSE)
1.
FCSE原理
通过修改系统中不同进程的虚拟地址,避免在进程间切换时造成的虚拟地址到物理地址的重映射(涉及重建MMU中的页表,使TLB和Cache失效),从而提高系统性能。
2.
FCSE实现
ARM系统将4GB虚拟地址空间分为128个进程空间块,每个进程空间块大小为32MB。每个进程空间块可以包含一个进程,该进程可以使用虚拟地址空间0x00000000-0x01FFFFFF,这个地址范围就是CPU看到的进程的虚拟空间,系统128个不同进程空间块的编号0—127,编号为i的进程空间块中的进程实际使用的虚拟地址空间为(i×0x02000000-- i×0x02000000+0x01FFFFFF),这个地址空间是系统中除了CPU之外的其他部分看到的该进程所占用的虚拟地址空间。 |