作者:ARM-WinCE
在 OAL 中有两个和 Cache 相关的函数,一个是 OEMARMCacheMode ,另一个是 OEMCacheRangeFlush 函数,这两个函数在 ARM 处理器上是必须实现的。
OEMARMCacheMode 函数用于设置基于 ARM 处理器页表的 cache 模式,主要是设置 MMU 页表中的 C , B 控制位,达到控制相应的存储空间的缓冲特性的目的。一般默认 C 和 B 控制位都被设置为 1 ,表示对 Write-through 模式和 Write-back 模式采用 cache 和 write buffer 技术。
函数实现如下:
LEAF_ENTRY OEMARMCacheMode
mov r0, #0x0C
该函数已经被实现,在 PLATFORM 目录下可以被搜索到。默认情况下将 C , B 都设置为 1 ,将值保存在 r0 寄存器中。
OEMCacheRangeFlush 用于刷新某个地址范围内的 Cache 和 TLB ,会被 WinCE 内核调用。在 OEMInit 函数被内核调用以后,内核会调用该函数刷新整个指令和数据 TLB 。
函数定义如下:
void OEMCacheRangeFlush(LPVOID pAddr, DWORD dwLength, DWORD dwFlags)
pAddr :要被刷新的虚拟起始地址
dwLength :被刷新的大小
dwFlags :刷新标记位,如下:
CACHE_SYNC_WRITEBACK :写回被 cache 的数据
CACHE_SYNC_DISCARD :写回并刷新 被 cache 的数据
CACHE_SYNC_INSTRUCTIONS :刷新 所有的指令 cache 数据
CACHE_SYNC_FLUSH_I_TLB :刷新指令 TLB
CACHE_SYNC_FLUSH_D_TLB :刷新数据 TLB
CACHE_SYNC_FLUSH_TLB :刷新指令和数据 TLB
CACHE_SYNC_L2_WRITEBACK :写回二级 cache 数据
CACHE_SYNC_L2_DISCARD :写回并刷新 二级 cache 数据
CACHE_SYNC_ALL :做上面所有的操作
该函数也已经被实现,在 ”Platform/COMMON” 目录下可以搜索到。一般来说上面两个函数不需要再被实现了,我想只要知道这两个函数,了解一下就可以了。