1. Cache简介
Cache:高速缓冲存储器,是位于CPU和主存储器DRAM(DynamicRandomAccessMemory)之间,规模较小,但速度很高的存储器,通常由SRAM(StaticRandomAccessMemory静态存储器)组成。它是位于CPU与内存间的一种容量较小但速度很高的存储器。
2. SylixOS中Cache架构
SylixOS中为了对Cache进行有效的管理,提供了API层的系统接口,隐藏硬件架构之间的差异。在不同的CPU架构下,又各自封装了Arch层的Cache操作接口。
2.1 API层Cache接口
SylixOS中Cache层封装的API接口代码位于/libsylixos/SylixOS/kernel/cache目录下,包括cache.c和cache.h两个文件,提供包括Cache使能、禁能、刷新、回写、内存分配等等一系列接口。
cache.c文件中维护全局结构体变量_G_cacheopLib保存CPU架构的各种Cache操作接口函数,也即是从Arch层获取到的不同体系结构下的Cache操作接口函数。
cache.c文件中提供各种API接口,包括API_CacheEnable、API_CacheDisable、API_CacheLock、API_CacheUnlock、API_CacheFlush、API_CacheFlushPage、API_CacheInvalidate、API_CacheInvalidatePage、API_CacheClear、API_CacheClearPage、API_CacheTextUpdate、API_CacheDataUpdate、API_CacheLocalTextUpdate等常用的Cache操作函数。所有API接口实现的Cache操作均是通过获取全局结构体变量_G_cacheopLib的函数指针成员完成相应操作的。
2.2 Arch层Cache接口
BSP程序中调用函数API_CacheLibPrimaryInit初始化Cache系统,其中调用到函数archCacheInit,然后在PPC架构下会调用函数ppcCacheInit,通过调用函数ppcCacheProbe探测Cache类型。Cache探测过程中会遍历结构体数组_G_ppcCacheDrivers,查询到系统中已支持的PPC架构的Cache类型,则会初始化全局结构体变量_G_cacheopLib,供API层Cache接口使用。
3. PPC架构下Cache操作实现分析
SylixOS中PPC架构的Cache操作函数代码位于/libsylixos/SylixOS/arch/ppc/mm/cache目录下,其中common目录下封装了通用的PPC架构的Cache驱动。
在调用函数ppcCacheProbe之后,如果成功探测到Cache类型,结构体指针_G_pcachedriver则会指向指定CPU型号的Cache驱动操作函数集。
类似于API层提供的各种接口,common目录下的ppcCache.c文件中同样封装了常用的Cache操作函数集合。这些函数操作集即为API层全局结构体变量_G_cacheopLib中各个函数指针提供真正的函数实现。
SylixOS目前实现的PPC系列体系架构目前主要包括E200、E500和60x系列。
3.1 E200系列
E200系列Cache操作函数代码位于/libsylixos/SylixOS/arch/ppc/mm/cache/e200目录下,其中ppcCacheE200.c文件定义了E200的Cache驱动结构,包括ppcE200CacheProbe、__ppcE200CacheDisable、__ppcE200CacheEnable、ppcE200DCacheClear、ppcE200DCacheFlush等等函数。各个函数的具体实现位于汇编文件ppcCacheE200Asm.S中。
3.2 E500系列
E500系列Cache操作函数代码位于/libsylixos/SylixOS/arch/ppc/mm/cache/e500目录下,其中ppcCacheE500.c文件定义了E500的Cache驱动结构,包括ppcE500CacheProbe、ppcE500DCacheDisable、ppcE500DCacheEnable、ppcE500ICacheDisable、ppcE500IcacheEnable、ppcE500DcacheFlushAll、ppcE500DCacheFlush等等函数。各个函数的具体实现位于汇编文件ppcCacheE500Asm.S中。
3.3 60x系列
60x系列Cache操作函数代码位于/libsylixos/SylixOS/arch/ppc/mm/cache/ppc60x目录下,目前SylixOS中60x系列CPU实现包括603、604、EC603、745、83xx。其中ppcCache603.c、ppcCache604.c、ppcCache745x.c、ppcCache83xx.c、ppcCacheEC603.c文件定义了各个CPU的Cache驱动结构。60x系列各种CPU使用同一种Cache接口,具体实现在ppcCache60xAsm.S在文件中。包括ppc60xICacheEnable、ppc60xDCacheEnable、ppc60xICacheDisable、ppc60xDCacheDisable、ppc60xICacheInvalidate、ppc60xDCacheClear、ppc60xDCacheInvalidate、ppc60xDCacheFlush等等函数。
3.4 其他待实现系列
其他待实现PPC系列CPU,添加驱动代码时,需在/libsylixos/SylixOS/arch/ppc/mm/cache/目录下添加对应系列的文件目录,在其目录下增加对应的.c和.S文件,.c文件中定义Cache操作函数集合,.S文件中实现Cache操作内容。
添加完成驱动后,在common目录下ppcCache.c文件中结构体_G_ppcCacheDrivers中添加对应的驱动指针,随后在初始化此系列CPU的时候即可探测到新添加的系列的Cache函数集合。