vxWorks内存管理

转:缩短vxworks启动时间的方法  
对于有mmu的cpu系统,vxworks系统的一般启动时间在10秒左右。相对于windows之类启动时间几分钟来说,可以说是非常短了。然而对于从上电到启动用户程序在1秒内的特殊要求。10秒显然是太长了。这里解决了这个问题。具体的平台为一块powerpc7xx单板机,有南桥,北桥,pci,vme总线。这里的解决方法,实际上是不限于powerpc cpu的,因此对于有类似要求,别的平台的用户来说也具有价值。 
由于对于启动时间有特殊要求,因此首先做的是要详细了解vxWorks OS 的启动步骤。通过研读代码,知道启动部分后,相应找到了影响启动时间的关键部分,通过修改 1内存清零操作,2 sdram ECC 校验 3,网络启动部分 4,vxWorks内存管理。使启动时间控制在1秒内。 这里主要介绍对于vxWorks内存管理的修改。先简要介绍PowerPC MMU  
1 MMU简介  
内存管理是一项由MMU硬件以及VxWorks软件配合完成的工作。 
硬件的MMU特性对于OS中的设计有较大的影响,内核OS算法处理页表及TLB的底层函数受硬件MMU特性的影响很大。 
OS内核软件与处理器MMU硬件的接口、内存管理的软硬件分工,是OS设计中的关键部分。 MMU(硬件):负责使用PTE来转换虚拟地址为物理地址。 
OS内核:建立页表,在PTE中填写正确的数据,设置MMU相关寄存器使之指向页表。  
1.1 TLB模式  
4位段寄存器索引 | 16位页索引 | 12位的字节偏移量 段寄存器 32位有效地址 
24位 VSID | 16位页索引 | 12位的字节偏移量 52位虚拟地址 TLB/页表 
20位物理页号 | 12位的字节偏移量 32位物理地址   
处理器在每次地址转换时都要访问内存中的页表,则系统会产生大量的内存访问。因此,上述问题是通过MMU硬件中的TLB(快表)来实现缓存当前使用的地址转换。 
通过在处理器中的TLB来保存一份在物理内存中的最近被使用过的页表入口项(PTEs),从而缩短对页表搜索的时间。 
TLB由硬件实现,其中的表项的每一项映射一个物理页面。每次MMU进行地址转换操作时,首先检查该TLB所有表项及其控制的相应Cache,如果一份拷贝在TLB中的PTE被找到,则可免除在内存中查找页表(page table)而占用总线。 TLB有两个操作:(1)加载;(2)报废/清除。 
当MMU硬件产生一个TLB失效时,OS内核定位地址转换信息,显式加载一个TLB表项。TLB表项的更新需与页表项的更新同步。TLB并不能自动保持与PTEs的一致性,所以每次软件改变了物理内存中的页表之后,软件必须执行相应的TLB失效操作,以便保持TLB与页表的一致性。页
目录基地址寄存器被写入时,OS清除整个TLB。  
TLB的使用有两个注意的事项: 
(1) 清空TLB是非常耗时的操作,当涉及多个页面的时候,内核OS必须选择清除整个TLB缓存,逐一清除许多表项会带来更多的TLB失效。 
(2) 尽可能减少TLB的竞争使用;过度的竞争TLB会导致TLB刷新频繁,效率大大下降。  
1.2 BAT模式 
BAT模式是另外一种从逻辑地址到物理地址的转译方式,这不同于TLB/哈希表的页面机制。BAT用于映射大于一页的连续物理内存空间,这样的空间可以不受控于通常的虚拟内存管理。BAT寻址模式依靠8个BAT寄存器来实现,这些BAT寄存器实现128K或者更大的虚拟内存块映射到连续的物理内存中。这样的大块连续物理内存空间一般用于保存数据,例如映射到内存中的显示缓冲区或者是巨型数组中的数据。 
BAT模式的缺点是颗粒度太粗,最小的内存块也必须是大于128K。  
2 VxWorks 内存管理  
VxWorks内存模式为flat模式。所有的任务都运行在同一地址空间里。内存管理混合使用BAT模式与页表模式.VxWorks通过两个数据结构来抽象BAT模式与页表模式. 
BAT模式:UINT32 sysBatDesc [2 * (_MMU_NUM_IBAT + _MMU_NUM_DBAT)]为一整形数组 页表模式:PHYS_MEM_DESC sysPhysMemDesc [] 为结构PHYS_MEM_DESC的数组。  
PHYS_MEM_DESC定义如下 
/* physical memory descriptor is used to map virtual memory in sysLib  * and usrConfig. */ 
typedef struct phys_mem_desc { 
void *virtualAddr; void *physicalAddr; UINT len; 
UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC;  
问题的产生, bsp里主要使用页表影射,页表影射内存与所需页表的大小之间的关系如下: 页表尺寸 = ((内存总数(sdram+pci mem + pci I/O +vme mem + flashrom)/页尺寸(4k))/2)*sizeof(PTEGS)(64) 
1G的影射内存所需页表数为8Mbyte.因此建立页表,在PTE中填写正确的数据所需时间需5~6秒。  
初步解决对策: 
1. 缩小页表,即缩小内存总数 
2. 将页表存为文件,启动时直接读取,跳过建立页表部分 
3. 转换思路,从主要使用页表影射转换为主要使用BAT影射  
我们来看一下上述解决对策是否可行。 1对策 
缩小页表,即缩小内存总数,可以修改的部分包括SDRAM ,PCI MEM,PCI I/O MEM,VME MEM,修改方法在Tornado环境里修改配置参数,修改容易,修改后的效果较好,启动时间只需2 秒。不利的方面,SDRAM缩减为32M,而且时间仍然较长。  2对策 
将页表存为文件,启动时直接读取,跳过建立页表部分。因我们的系统资源是固定的,使用此法可行.但要将页表存为文件,我们又面临多种选择,1重写OS MMU 部分。2改写Vxworks MMU. 2.1重写OS MMU 部分 
难度较大,时间紧迫,而且最关键部分,重写的OS MMU与VxWorks是否能够无缝结合,实践证明能够在另一操作系统下稳定运行的OS MMU与VxWorks结合,并不能稳定运行。原因OS MMU并不能完全与OS Memory,OS I/O无关。OS设计需要一种综合考虑。微内核体系结构也并不能完全解决此问题。结论,此路不通 2.2改写Vxworks MMU 
需要Vxworks kernel 源码,所幸已经得到。但考虑到1G的影射内存所需页表数为8Mbyte,而flashrom读取速度为10M/s .即使修改完毕,仅读取页表所需时间将近1s.所耗甚大,所得甚微。结论,此路不通  3对策 
使用BAT影射,需要修改部分为sysBatDesc [],即BAT影射数组,修改容易。 
但BAT寄存器只有4对,分为指令与数据BAT,因此只有与页表影射相结合。将大块内存使用BAT影射,小块内存使用页表影射.因此将SDRAM,FLASHROM影射改为使用BAT影射。修改效果好。达到了预期效果。 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值