技术开发 频道

Windows CE .NET 高级内存管理

 【IT168技术文档】Microsoft_ Windows CE 的优点之一是它的 Microsoft Win32_ 应用程序编程接口 (API) 支持。无数 Windows 程序员可以利用他们的 Win 32 API 和 MFC 知识相对容易地转移到 Windows CE。Windows CE 可以实现 Win32 API 的子集,但程序员应当永远不要忘记 Windows CE 是与 Windows XP 完全不同的操作系统,Windows CE 具有不同的要求和不同的实现。在设计应用程序或诊断问题时知道 Windows CE 如何实现它的 Win32 兼容性是一件非常重要的事情。

 内存管理是 Windows CE 和 Windows XP 之间在实现方面存在很明显差异的地方之一。虽然 Windows CE 支持几乎每个 Win32 内存管理函数(除了我们不赞成对它使用全局堆函数),但是这些内存管理 API 的实现是完全不同的。这些差异可以妨碍那些不熟悉 Windows CE 与 Windows 的桌面版本之间的细微差异的程序员。要了解这些问题位于哪里,必须首先了解 Windows CE 如何管理内存。

 系统内存映射

 Windows XP 和 Windows CE 都是 32 位操作系统,都同样支持 4 GB 的虚拟地址空间。Windows XP 将地址空间划分为两个 2 GB 区域。上半部地址空间是为系统保留的。下面 2 GB 地址空间则由每个正在运行的应用程序重复使用。

 图 1. Windows XP 虚拟内存空间

 第一眼看,Windows CE 的虚拟地址空间是以类似系统保留区域的方式组织的,并且是重复的应用程序空间。图 2 显示了 Windows CE 地址空间。在这里,上部 2GB 地址空间也是为系统保留的。下半部地址空间则划分为很多区域。该区域的大多数(几乎一半空间)被定义为大型内存区域 (Large Memory Area)。该区域用来分配通常用于内存映射文件的大型内存空间块。

 在大型内存区域的下面是另一个大型区域,本文称为保留区域。在保留区域的下面,在内存空间的最底端,是一个 64 MB 的区域。该 64 MB 区域,更准确地说是最下面的 32 MB 区域,是每个正在运行的应用程序重复使用的区域。

 图 2. Windows CE 虚拟内存空间

 Windows CE 应用程序内存映射

 最下面的 64 MB 虚拟地址空间是驻留 Windows CE 应用程序的地方。图 3 显示了该应用程序虚拟地址空间。像在 Windows XP 应用程序中一样,应用程序代码从虚拟地址 0x10000 开始加载。应用程序启动时,将在地址空间中为所有代码保留足够的空间。然后,在需要实际代码时,这些代码将被按需分页调度进该地址空间。

 在为代码保留的区域上面,页是为只读和读/写静态数据区域保留的。此外,还为本地堆和应用程序中运行的每个线程的堆栈保留了区域。当线程启动时,为每个堆栈保留的区域的大小是固定的。只在堆栈增长时才会提交实际的 RAM。另一方面,堆保留了需要在堆中分配 RAM 块时增长的区域。

 当加载“现场执行”(XIP) DLL 时,将从 64 MB 空间的顶部向下加载这些 DLL。当创建 ROM 时,每个 XIP DLL 都会被定址(确定在地址空间中的位置)。加载非 XIP DLL 时,将把它放在 32 MB 边界的下面。非 XIP 的 DLL(也叫作基于 RAM 的 DLL)是指那些从对象存储区加载的 DLL、从 ROM 解压缩的 DLL或从外部文件系统(例如 Compact Flash 卡)加载的 DLL。应用程序虚拟内存空间中靠上位置的 32 MB 仅用于 XIP DLL。

 图 3. Windows CE .NET 应用程序虚拟内存空间

 由应用程序通过创建单独的堆或直接调用 VirtualAlloc API 所分配的任何其他内存将从底部向上进行分配,分配时,系统将查找第一个足够大、可满足分配的可用区域。

0
相关文章