Symbian与WinCE内存管理技术分析及比较
(2)虚拟地址映射
MMU一般将页面分成4 KB大小的页面。由于CPU不同,页面大小也可以是1 KB或其他大小。内核使用MMU,将物理内存映射到块的虚拟地址范围内。WinCE与Symbian的虚拟地址映射图如图1所示,其中WinCE内核表现为NK.exe进程。
在ARMv5中,最高层的页表有4 096个条目,每个条目4字节,因此整个目录就有16 KB。由于WinCE支持多种不同的CPU,CPU设计结构不同页目录也不同,但是计算方法与ARMv5类似。WinCE首先直接给每个进程分配一个不同的页表,在进程切换中直接将不同进程的页表写入MMU的基寄存器TTBR中来实现映射。而Sym-bian系统认为每个进程分配16 KB页表会造成内存的浪费,因此采用了另一种管理地址映射的方法。
该模型针对ARMv5结构设计,被称为移动内存模型。其核心思想是对每个进程都提供同样的虚拟地址空间,但是被保护的内存页面却不一样。在页面切换中,首先将原有进程的内存移出执行地址空间,使其在用户模式下不能访问。接着将新进程的数据移入执行地址,并使其可以访问。这一思想是在内存模型上层通过Chunk实现的。通过ARMv5中提供的页表访问权限和域概念,通过改变MMU中寄存器指向的域,达到进程间保护和内存映射。这种设计方法带来了内核层的低内存消耗,但是虽然在内核层的安全性和内存使用效率上有所改善,却对其他进程的运行带来一定影响。当映射到不同的虚拟地址空间,所有被修改的数据都要重新从主存中载入,并且缓存中的数据因为已经被丢弃,必须重新载入。因此,该模式下的进程上下文中很大一部分时间消耗在缓存的刷新上,一般情况下其速度是线程切换(同进程)的1/100左右。尽管采取了其他措施,但是没有从根本上改变运行时间。
在最新的ARMv6中,Symbian引入了多重内存模型。该模型兼容性更强,并可在主流处理器Intel x86和Re-nesas SuperH上使用。该模型建立在与设备和操作系统无关的基础上,利用ARMv6中的应用空间辨识器(ASID),并通过物理标记缓存技术保证了在虚拟地址和物理地址间多重映射的正确性,很好地解决了移动内存模型中的缓存刷新问题。
2.4 其他技术
(1)按需页面调度
由于在系统中虚拟内存远大于物理内存,因此系统必须对内存使用格外注意。一种节约物理内存使用的方法是,只加载当前运行程序使用的虚拟内存所对应的物理内存,这种方法称为按需页面调度。当一个进程试图访问一个不在当前内存中的虚拟内存地址时,系统这时会重新从磁盘上将该区域加载到内存中去。桌面操作系统很久以来一直使用这一技术,来加快系统启动速度和优化程序运行效率,WinCE也不例外。
WinCE中,可以通过使用Config.bib对整个系统的按需页面调度进行设置,或通过LoadDriver等函数对单个DLL的按需页面调度进行设置。Symbian操作系统却不支持这一技术。这主要是由于系统本身内存太小,采用这一技术会带来性能大幅下降。不过随着手机硬件的发展,在Symbian OS v9.3以后,系统开始支持按需页面调度。这一技术优化了内存使用,在需要时加载只读代码,从而实现了对RAM的更高使用效率。这让用户可以更快地安装应用程序,并同时保持多个应用程序的开放状态。
(2)内存碎片整理
在一个实时系统中,连续的页面请求可能会带来性能的下降。这是由于在小对象(小于1 KB的数据类型)对内存的频繁的动态申请和释放过程中,由于释放后留下的空洞不够新对象分配,导致不连续的内存可用空间无法被应用程序获得,造成可用内存迅速耗尽。这种内存空洞也叫内存碎片。操作系统可能会对这种情况作一定程度的优化,但是由于将内存可用空间压缩而导致的效率负担,并不是所有的操作系统都会对此优化。
得益于Symbian操作系统本身优化的内存管理和高度受限的内存使用原则,内存碎片其实并不会对手机系统的性能和内存使用率造成明显影响,因此早期的Symbian版本并不支持内存碎片整理,只提供简单的手动内存压缩功能。Symbian 9.5之所以引入"自动"内存碎片整理,一个重要的原因是:目前手机终端的内存容量变得越来越大,内存的能耗已经不容忽视。在新版本中,借助内存碎片整理,可以关闭连续的空闲物理内存块以节约能耗,当然它同时也提供了其他在主流操作系统中体现的改进一一更高效的内存访问和更大的空闲可用内存。在WinCE中,虽然不存在自动内存碎片处理,但是微软推荐使用VirtualAlloc、LocalAlloc、HeapAlloc等函数直接操作虚拟内存页,本地堆和分离堆进行内存分配操作,而不是使用如malloc、new这类会导致内存泄漏或异常的操作。
3 小 结
Symbian与WinCE在内存管理模块的设计上各有优劣,这主要是由于两个操作系统在设计之初的理念不同。Symbian设计之初是以高度受限的内存为原则进行设计,在硬件发展较为落后的时期取得了巨大的成功,但这也给第三方软件开发者带来很多困难。WinCE设计之初既要保持与Windows其他系统在编程接口上的兼容,又要尽可能地提高内存使用效率,这样不免对性能带来一定程度的影响。随着硬件的发展,智能手机的处理器速度和内存大小都有了很大提高,WinCE由于对第三方开发者的友好性,其发展仍然不可限量。
- Linux内存使用的体会 (04-23)
- 嵌入式操作系统uCLinux详解(03-19)
- μC/OS-Ⅱ实时操作系统内存管理的改进(04-10)
- 动态内存管理在面向嵌入式实时系统中的研究(06-28)
- 记录仪实时多任务调度策略的研究(07-16)
- 基于ADSP—BF533的μClinux嵌入式系统移植与开发(07-31)