MMU在VxWorks中的实现
1. 内存管理单元MMU
VxWorks提供两级虚内存支持:与VxWorks捆绑在一起的其本级和需要可选产品VxVMI的完全级。
1.1 指令和数据MMU
PowerPC MMU允许指令和数据MMU被分别运许或禁止。在SELECT_MMU下的属性窗口的参数表中的参数USER_I_MMU_ENABLE和USER_D_MMU_ENABLE缺省是被允许的。为了允许/禁止一个或两个MMU,选择合适的参数并设置/删除TRUE。
1.2 60X内存映射
Power PC 603和604的MMU两种模式的内存映射。第一种是BAT模式,它允许在大小从128KB到256KB的内存块映射进一个BAT寄存器。第二种是段模式,它可以将内存映射为4KB的页。Tornado支持这两种内存模式。
1.2.1 603/604的块地址变换模式
一个BAT寄存器的大小是两个32位的值。对于Power PC 603和604,有八个BAT寄存器实现:四个用于指令MMU,四个用于数据MMU。
在sysLib.c中定义的sysBatDesc[]处理BAT寄存器配置。寄存器由MMU库中的初始化软件设置。缺省这些寄存器被清零。
用于填充数组sysBatDesc[]的所有配置常量在适合于Power PC 603和604的目录installDir/target/h/arch/ppc/mmu603Lib.h中被定义。
1.2.2 603/604的段模式
这种模式指定每一内存页的配置。整个物理内存由sysLib.c中定义的数据结构结构sysPhysMemDesc[]描述。这个数组由每一页或每一组页的配置常量组成。所有的配置常量在表中定义。虚内存接口对Power PC虚内存是有用的。
使用在表中列出的用于每一页或每一组页的常量VM_STATE_CACHEABLE来设置cache为copy-back模式。
除VM_STATE_CACHEABLE之外,还支持如下常量:
VM_STATE_CACHEABLE_WRITETHROUGH
VM_STATE_MEM_COHERENCY
VM_STATE_MEM_COHERENCY_NOT
VM_STATE_GUARDED
VM_STATE_GUARDED_NOT
第一个常量设置页描述符cache模式域为可cache的write-through模式。Cache的一致性和保护模式由其他常量控制。
页表大小依赖被映射的总的内存。被映射的内存越大,页表越大。在MMU库初始化期间,被映射的内存的总大小被计算,这允许动态决定页表大小。下表显示待映射的内存的总数和页表大小之间的对应关系。
待映射的内存的总数和页表大小之间的对应关系
8MB or less 64KB
16MB 128KB
32MB 256KB
64MB 512KB
...
2. 虚拟内存(包括VxVMI选项)
对于带有MMU的板子,VxWorks提供虚拟内存的支持。捆绑虚拟内存支持提供标记不可cache的缓冲区的能力。这对内存在处理器间共享或发生DMA传送的多处理器环境是有用的。关于捆绑虚拟内存支持的信息,可参考虚拟内存接口和vmBaseLib和cacheLib的引用入口(库函数)。
非捆绑虚拟内存支持可用作可选的组件VxVMI。VxVMI提供了设置文本段text和中断向量表为只读的能力,并且包括一组用于开发人员管理他们自己的虚拟内存上下文的子程序。关于VxVMI的信息,可参考虚拟内存接口和vmLib的引用入口(库函数)。
3、虚拟内存接口
3.1 介绍
VxWorks提供两级虚内存支持:基本级被与VxWorks捆绑在一起并且提供基于每一页的cache。完全级是非捆绑的,并且需要可选组件VxVMI。VxVMI提供文本段text和VxWorks中断向量表的保护,并且提供一种体系结构无关的接口给CPU的内存管理单元MMU。关于怎样安装VxVMI的信息,参考Tornado入门。(Tornado Getting Started)。
3.2 基本虚内存支持
对于带有MMU的系统。VxWorks允许你通过设置相关缓冲区不可cache来更有效的执行DMA及处理器间的通信。当其他处理器或DMA设备正访问同一内存位置时,确保数据没有进行局部的缓冲是必要的。如果没有能力将内存的个部分设置为cache的,那么cache必须从全局上被关闭(导致性能下降)或缓冲区必须被手工地刷新/使无效。
通过在项目工具(project facility)VxWorks试图中选择INCLUDE_MMU_BASIC包含基本虚内存支持,虚内存配置,也可以用cacheDmaMalloc()分配不可cache的缓冲区,参考cacheLib的引用入口(库函数)。
3.3 虚内存配置
以下讨论的配置适用于捆绑和非捆绑的虚内存支持
在项目工具中定义如下的常量来反映你的系统配置。
MMU配置常量:
常量描述
INCLUDE_MMU_BASIC 不带VxVMI选项的基本MMU支持
INCLUDE_MMU_FULL 带VxVMI选项的完全支持MMU支持
INCLUDE_PROTECT_TEXT 文本段保护(要求完全的MMU支持)
INCLUDE_PROTECT_VEC_TABLE 中断向量表保护(要求完全的MMU支持)
对于你的处理器,合适的缺省页大小(4KB或8KB)由你的BSP的VM_PAGE_SIZE定义。如果你因为某种原因必须改变这个值,重定义config.h中的VM_PAGE_SIZe。参考VxWorks程序员指南第八章配置和编译。
为设置内存为不可cache,必须有一种虚-到-物理的映射。在vmLib.h中的数据结构PHYS_MEM_DESC定义用于映射物理内存的参数。每块板的内存映射用sysPhysMemDesc(被声明为一个PHYS_MEM_DESC的数组)在sysLib.c中定义。除了定义内存页的初始状态之外,sysPhysMemDesc还定义用于映射虚-到-物理内存的虚地址。
修改sysPhysMemDesc还定义用于映射虚-到-物理内存的虚地址。
修改sysPhysMemDesc以反映你