存;
STATUS vmBaseStateSet(context,pVirtual,len,stateMask state) Context:映射的上下文,变量类型:VM_CONTEXT_ID; Pvirtual:被修改状态的虚拟地址,变量类型:void*; Len: 映射的长度,变量类型:int; StateMask:Unsigned int; State: Unsigned int
? 该函数改变了一块虚拟内存的状态:用于改变由sysPhysMemDesc[]定义的初始内存映射; ? 函数的第一个参数为NULL时表示指示的是当前的context;
? 虚拟映射对基本级的MMU是全局的,对于构造和管理私有context的信息请参照VxVMI; 四、速缓存Cache机制
? 在VxWorks中,如果MMU使能,Cache就在MMU的控制下;
? 系统库(cacheLib)中提供基本的cache管理支持,其中BSP的主要功能:
选择合适的cache库和模式执行多个cache的操作; 如果MMU使能,内存映射将被标识是否被cacheable;
遵循设备驱动器的cache策略,对BSP控制的系统设备进行操作;
STATUS cacheLibInit(intMode,dataMode)
IntMode 定义指令cache的模式,类型:CACHE_MODE DataMode 定义数据cache的模式,类型:CACHE_MODE
? 初始化cacheLib机制:
调用结构定义的初始化函数; 置cache为静态;
在sysHwInit()运行之前由usrInit()调用。
? 参数用来定义指令/数据caches的模式 ? CACHE_MODE 在../h/cacheLib.h中声明
? Cache的模式配置宏:USR_I_CACHE_MODE ,USR_D_CACHE_MODE
6
? 对cache模式配置的宏的确省值在configAll.h中定义。如果需要则在config.h中重新定
义:
? 对指令和数据的缺省模式是writethrough
? cache模式由具体的cache库用来配置合适的cache硬件
? 如果目标板支持多cache的操作,BSP负责选择恰当的库package:
MACRO_ARCH_MULTIPLE_CACHELIB 必须在../h/arch/
如果为TRUE则通过声明和初始化sysLib.c和config.h中的sysCacheLibInit提供正确的cache初始化;
FUNCPTR sysCacheLibInit=(FUNCPTR) cacheXLibInit; ? 对于L2 cache,BSP需要提供单独的cache管理库:
? 系统支撑决定_ARCH_MULTIPLE_CACHELIB是否定义为TRUE,BSP并不控制;
STATUS cacheEnable(cache) cache:CACHE_TYPE
? 使能特定的cache类型:指令、数据或者分支要使用特定系统的函数; ? 必须undefine config.h中的宏来禁止:
INCLUDE_CACHE_SUPPORT为任何cache的类型; USER_I_CACHE_ENABLE为指令Cache; USER_D_CACHE_ENABLE为数据Cache; USER_B_CACHE_ENABLE为分支Cache
? 在usrInit()中被调用,在KernelInit()调用之前; ? 缺省的所有Cache类型在configAll.h中定义; ? CACHE_TYPE结构在../h/cacheLib.h中声明;
7
? Cache类型定义在../h/cacheLib.h中
? 对管理有效访问设备的代码不论设备是否独立于BSP
要保持cache与DMA设备和硬件寄存器的一致性 管理设备内存访问方法
防止RISC处理器的指令的无序操作
? 使用cacheLib实行期望的cache管理
为cache分配安全的缓冲区
为一个驱动器(系统设备或BSP独立的设备驱动器)分配属性并且申请执行方法
? 一些系统具有特殊的cache库,具体可参见VxWorks Reference Manual
? 对设备cache的管理机制与被分配的可由设备访问的内存大小有关
? 可由设备访问的被分配的内存使用:cacheDmaMalloc(), malloc和memalign,数据段和堆
栈段内存,系统区外的特殊内存区,未知的分配方法 ? 设备寄存器内存:
如果内存被映射,将使用上述方法中的一种被分配; 如果内存没有映射,将不被高速缓存;
void * cacheDmaMalloc(bytes)
bytes: 分配的字节数,变量类型:size_t
? 函数为DMA设备分配了cache-aligned,cache-safe 的缓冲区,返回内存的首地址
8
? cache对通过cacheDmaMalloc()分配的内存的一致性管理是依赖于MMU是否使能
如果MMU使能,被分配的内存被标为non-cacheable 如果MMU不被使能,刷新和禁止的宏代码调用必须插入代码
? cacheLib通过CACHE_FUNCS和CACHE_LIB结构(见。。/h/cacheLib.h)来管理刷新、禁止
和其他的宏程序,例如:
? 宏代码使用CACHE_FUNCS和CACHE_LIB结构中的程序指针,例:
? 通常情况下,如果一个特定的宏程序是一个no-op,它的CACHE_FUNCS和CACHE_LIB结构
中的程序指针为NULL:所有的探查、刷新和禁止函数被设置为NULL; ? 宏程序被分为两组:
CACHE_DMA_XXXX 这些程序刷新、禁止和执行其他的通过cacheDmaMalloc()分配的内存区域的操作
CACHE_USER_XXXX 这些程序刷新、禁止和执行其他的不是通过cacheDmaMalloc()分配的内存区域的用户操作
? CACHE_DMA_XXXX和CACHE_USER_XXXX宏定义使用低一级的宏程序CACHE_DRV_XXXX ? CACHE_DRV_XXXX 宏允许在提供cache与独立的内存分配方法一致的灵活性:程序具有一个
附加的指向CACHE_FUNCS结构的指针参数;
? 开发者能够使用CACHE_DRV_XXXX宏来控制cache与驱动器控制的内存、可定制的cache管
理的一致性
STATUS drvDmaExample (void * pBuf)
9
? Cache对设备的策略将由使用的哪一个cacheLib机制来决定 ? BSP开发者应基于设备的属性来开发cache,属性有:
WRITE_PIPING,
SNOOPED,
MMU_TAGGING,
USER_DATA_UNKNOW,
10