E500 Core 的 MMU/TLB 结构
MMU 是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此表称做TLB。MMU的两个主要功能是:
(1)将访问主存和访问I/O的逻辑地址转化为物理地址。
(2)内存保护。根据需要对特定的内存区块的访问进行保护,通过这一功能,可以将特定的内存块设置成只读、只写或是可同时读写
MMU在体系结构中的位置:
地址映射机制必须使一个程序能断言某个地址在其自己的进程空间或地址空间内,并且能够高效地将其转换为真实的物理地址以访问内存。一个方法是使用一个含有整个空间内所有页的入口(entry)的表(即页表),每个入口包含这个页的正确物理地址。这很明显是个相当大的数据结构,因而不得不存放于主存之中。
由于CPU首先接到的是由程序传来的虚拟内存地址,所以CPU必须先到物理内存中取页表,然后对应程序传来的虚拟页面号,在表里找到对应的物理页面号,最后才能访问实际的物理内存地址,也就是说整个过程中 CPU 必须访问两次物理内存(实际上访问的次数更多)。因此,为了减少CPU访问物理内存的次数,引入TLB。
TLB 和 CPU 里的一级、二级缓存之间不存在本质的区别,只不过前者缓存页表数据,而后两个缓存实际数据。它们和内存区域的对应关系如图所示。
VxWorks 对 E500 Core MMU 的支持
E500 处理器内核实现了 Book E 处理器规范,MMU 总是处于活动状态,任何内存地址访问内存必须经过TLB0(动态,固定4 KB页大小TLB)或者TLB1(静态,可变页大小TLB)翻译得到物理地址。
VxWorks 嵌入式操作系统很好地支持了 E500 处理器内核的 MMU,其中 BSP(Board Support Pack-age)中的数组 sysStaticTlbDesc[](定义在 sysLib.c)用于配置TLB1的地址映射,这个数组中的每一项可以指定地址空间(TS 位)为 0 或者 1;BSP 中的数组 sysPhyMemDesc[](也定义在 sysLib.c),数组用于配置TLB0 的地址映射,地址空间(TS 位)默认为 1,不可指定。
sysStaticTlbDesc[]数组最多只能配置 16 个 Entry,每个 entry 映射的地址范围是可变的,从 1 kB~256 MB 不等。在 sysStaticTlbDesc[]中首先要保证为VxWorks 启动和基本操作所需的各地址区域具有地址空间0的配置。
sysPhyMemDesc[]数组中的每个元素描述了物理内存中一个连续的块,其中包括物理地址、物理地址映射的虚拟地址(一般情况下与物理地址相同)、该块内存初始化状态信息、掩码信息。其可包含的映射空间有内存、Flash、ROM、I/O 设备等,可以根据系统的需求自行进行配置。在VxWorks的默认配置中,地址空间1下全部系统内存(RAM)都配置在sysPhyMemDesc[]数组中。
Vx Works 下 E500 Core MMU 的优化方法
VxWorks 在默认情况下为地址空间 1 运行所需的系统内存(System RAM)空间全部配置在sysPhysMemDesc[]数组中,即由 TLB0 来管理的。这样会有
下列两个缺点:
(1)会使 TLB0 过大,查询 TLB0 的时间会比较长,每次访问内存的时间就被相应延长,从而影响系统的实时性能。
(2)由于 TLB0 项数的限制(256,E500V1;512,E500V2,在系统内存(RAM)超过 1 GB(1 GB/4 KB=256)或者 2 GB(2 GB/4 KB=512)的情况下,不可能每一页都在 TLB0 中长期驻留,况且 TLB0 中还要配置ROM,外设,寄存器等的地址空间,这样必然会导致经常性 TLB 缺页(TLB Miss)的发生和页的更新置换,从而进一步影响系统性能。对实时性要求很高的嵌入式操作系统来说,如果经常发生 TLB MISS 或者 TLB 查询时间过长,将是不可接受的。
了减少查询时间和更进一步降低TLB缺页发生的几率,在 TLB1 有剩余可用项的情况下,把一部分系统内存配置在 sysStaticTlbDesc[]数组中,即由TLB1 中来管理和映射。这样既可以减少 TLB0 的项数从而降低整个TLB的查询时间,又可以减少TLB 的缺页几率。但是并非所有的系统内存都可以在TLB1中配置,这是因为 VxWorks 操作系统通常对内核代码,应用程序代码、栈数据和关键数据设置内存保护属性(例如:MMU_ATTR_PROT_SUP_READ,MMU_ATTR_PROT_SUP_WRITE[6]等),这样可以对它们提供有效的保护。但是这些属性TLB1不支持,因此内核代码、应用程序代码、栈数据和关键数据所占有的内存必须由 TLB0 管理,即必须配置在 sysPhysMemDesc[]数组中