32位应用程序到64位应用程序的迁移.doc





《32位应用程序到64位应用程序的迁移.doc》由会员分享,可在线阅读,更多相关《32位应用程序到64位应用程序的迁移.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、将程序移植到64位Windows雷立辉 整理 简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出了一个简单而系统的介绍。包括对于64位操作系统的版本,编程模型,一些移植原则甚至包括对驱动程序的移植原则的介绍。 作者介绍:系统分析员,现在在北京工作。作者的blog:.前言:或许大家还对32位的CPU及操作系统使用还是觉得非常的合乎日常需要,但Windows 64位已经悄悄的来到了各位的身边。不少软件厂商也纷纷宣称自己的软件已经支持64位操作系统了。笔者在几个月之前就成功的实施了一个软件的64位操作系统移植。大致方案是,上层应用程序仍然使用32位程序,但将
2、该系统软件的驱动程序统统的变成了64位。这也是让应用程序支持64位的最小代价。整个过程前后不到一个月(两个人月),就解决了大部分问题。而一些难啃的骨头都是因为以前的编码不太规范而引起的。因为这不是本文的主题,所以就此打住。 下面的内容就是我在工作过程中整理各种资料所得到的成果。为了文章的系统性,中间转贴了一些MSDN中文网站的内容。希望能对大家的工作有所帮助。一最有可能受益于64位的应用l 需要大量的可寻址内存,因而系统总体内存需求超过4GB 的应用。例如那些采用大型数据集的应用(金融和科学建模软件)和基于主机的桌面应用(在不降低性能的情况下同时运行多个线程);l 必须同时管理大量的用户或者应
3、用线程,例如大规模的瘦客户端解决方案,大型数据库,以及用于客户关系管理(CRM)、供应链管理(SCM)、企业资源规划(ERP)和数字版权管理(DRM)系统中的解决方案的数据仓库应用;l 需要通过实时加密和解密提高安全性的应用,包括电子商务应用和对专用或者分类数据的保护;l 需要数学精度和浮点性能的应用,包括建模、模拟、统计和金融分析、图像/视频/信号处理、物理、医学研究、远程通信、加密和压缩;l 需要大规模的、强大的数据库性能的应用,包括决策支持,搜索和索引,文档和内容管理,以及语音识别;l 需要64 位计算的大内存寻址功能的应用,包括很多高性能计算(HPC)群集应用;l 需要提供数字内容创建
4、功能,例如计算机辅助设计、制造和工程(CAD、CAM 和CAE)、数字音乐制作和视频编辑,以及实时媒体流解决方案;l 需要通过最大限度的性能实现逼真的影院级消费者体验,包括计算机游戏、数字视频和协作;l 需要将以前只限于64 位工作站的功能移植到企业、消费者和计算机爱好者的台式机中,包括3D 建模、渲染、动画、模拟和软件开发。二Windows XP的64位版分类微软在2003年3月28日发布了64位的Windows XP。64位的Windows XP称Windows XP 64-Bit Edition。其实就是64位版本的Windows XP Professional。根据不同的微处理器架构,
5、它分为两个不同版本:1.IA-64版的Windows XP针对英特尔(Intel)的IA-64架构的安腾2(Itanium2)纯64位微处理器的Windows XP 64-Bit Edition Version 2003 for Itanium-based Systems。它是拥有64位寻址能力的强大的操作系统,主要面向顶级的高端IA-64架构的工作站,用在高端的科学运算,石油探测工艺,立体绘图,复杂的动画制作等等,是一种用在高效能运算(High Performance Computing)的强大的操作系统。估计它可能会改名为Windows XP Professional Itanium-ba
6、sed Edition。支持双处理器;最低支持1GB的内存,最高支持16GB的内存。2.x64版的Windows XP针对超微(AMD)的x64架构的皓龙(Opteron)与速龙64(Athlon64)所属的64位扩展微处理器的Windows XP 64-Bit Edition for 64-Bit Extended Systems。由于英特尔也发布了x64架构的Intel EM64T技术的至强(Xeon)与奔腾4(Pentium 4)的64位扩展微处理器,故微软将该版本的的Windows XP 64-Bit Edition改为Windows XP Professional x64 Editi
7、on,它支持AMD与Intel的x64架构。可以使用在一般x64架构的工作站,桌面电脑以及笔记本电脑,用途与32位Windows XP Professional一样,但具有64位寻址能力。支持双处理器;最低支持256MB的内存,最高支持16GB的内存。Windows XP Professional x64 Edition与32位版本很相像三x64版的Windows操作系统的设计目标x64版有5大特征,即:1. 同时轻松支持32位Win32程序及64位程序;2. 在64位运行的程序代码和32位运行的程序应该是同一份代码;3. 使现有程序具有企业级应用性能;(Enable existing app
8、lications to scale to enterprise capacities)4. 支持新的设计使之可以利用巨大地址空间及内存空间;5. 支持32位既有程序。x64 位平台并没有出现 Win64 API,它仍然是熟悉的 Win32 API(现在更合适的名称为 Windows API)。但它出现了一些新的兼容 64 位的数据类型,所以可能需要对代码进行少量的更改。这就意味着开发者可以从单个代码库构建代码的 32 位和 64 位版本,减少了由于维护两个代码库所带来的维护开销。但是,在x64中,Microsoft 已经去除了一些旧的组件,如 Win16 子系统。所以Windows 64 位
9、代码不支持16 位的Windows程序。也不支持 POSIX 和 OS/2 子系统。又出现了一个新的子系统,称为 WOW64。四x64新出现的子系统WOW64WOW64 是 Windows-32-on-Windows-64 的缩写。它为现有的 32 位应用程序提供了 32 位的模拟环境,可以使大多数 32 位应用程序在无需修改而直接运行在 Windows 64 位版本上。它类似于旧的 WOW32 子系统,负责在 Windows 32 位版本下运行 16 位的代码。尽管x64 CPU本身具有 32 位兼容性模式,可以处理 IA-32 指令的实际执行,但WOW 层仍然必不可少。WOW子系统负责诸如
10、在32位和64位模式之间进程切换以及模拟32位系统的服务。例如,32位和64 位程序具有不同的注册表配置单元,还有一个用于 32 位二进制文件的不同的系统目录,而且64位二进制文件仍然使用 System32 目录。因此,当 32 位应用程序安装到系统中时,WOW层会确保将32位二进制文件置于一个新的目录 SysWOW64中。这是通过如下方式实现的:根据应用程序是否运行在 WOW 下,截获对 API 的调用(如 GetSystemDirectory)并返回适当的目录。类似的问题可能会存在于注册表中。因为 32 位和 64 位的 COM 服务器都可以安装在系统上,并位于相同的类标识符 (CLSID
11、) 下,因此 WOW 层需要将对注册表的调用重定向到适当的32位或64位配置单元中。WOW 层也会处理注册表中某些区域之间的镜像更改,以便使其更简单地支持32位和64位代码之间的交互操作。 WOW64 非常重要,因为当不关注性能和可伸缩性的问题时,它使开发者可以利用大多数现有的32位代码。它是两种方法的最佳结合。开发者可以将应用程序服务迁移到64位,同时将 Microsoft 管理控制台 (MMC) 配置管理单元保留为32位。Windows 64 位版本包括 MMC的32位和64位的版本。当选择保留管理工具为32位时,进程间的通讯可能会遇到某些问题,但是只要接口设计正确,诸如远程过程调用 (R
12、PC) 的协议应该可以在32位和64位进程之间运行。有关 WOW64 的另外一点需要牢记:它并不是为要求高性能的应用程序而设计的。至少,WOW64子系统需要将32位参数扩展到64位,并且需要将64位的返回值截断为32位。在最糟糕的情况下,WOW64 子系统将需要进行内核调用,涉及到的不仅仅是到内核的转换,还有从处理器的32位兼容性模式到其本机64位模式的转换。在 WOW64 下运行时,应用程序将无法妥当地进行调整。对于那些要将其保留为32位的应用程序而言,必须在WOW64下测试它们。如果性能不能满足期望,则需要考虑将应用程序迁移到64位。 WOW64是在用户模式下实现的,作为ntdll.dll
13、和内核之间的层。WOW64及其支持的一些 DLL仅仅是可以加载到32位进程中的64位的 DLL。对于所有其他情况,进程保持为纯进程。32位的进程无法加载64位的DLL,反之亦然。所以,请检查代码中的所有“LoadLibrary”调用是否有效。 有关 WOW64 的详细信息,请参阅 Microsoft_ Platform SDK 中的“64-bit Windows Programming - Running 32-bit Applications”。五64位windows内存地址空间映射默认情况下,Windows 32位版本的地址空间限制在4GB,其中一半是为内核保留的。这限制了普通的应用程序只
14、能使用2GB的有效虚拟内存。2 GB看起来好像很多,但是由于错误的分配算法、大型文件映射甚至过多的使用 DLL,地址空间很容易在应用程序中变得零碎。看一下任务管理器中的“VM Size”列,就会发现普通应用程序消耗的虚拟内存量。当然,就想过去的 DOS 时期(利用 XMS/EMS)一样,有很多种方法可以使 32 位的应用程序访问多于 4 GB 的物理内存。进入物理地址扩展 (PAE) 和地址窗口扩展(Address Windowing Extensions,AWE)。PAE 通过将地址位的数量从 32 扩展到 36 来工作,这样使应用程序可以寻址的空间达到 64 GB。AWE 使应用程序可以将
15、大于 4 GB 的物理内存范围映射到虚拟地址空间中。这两种方法都引入了开销并增加了代码的复杂性。 Windows 64 位版本提供 16 TB 的有效寻址空间,其中一半可用于用户模式的应用程序。这意味着整个数据库可以移动到内存中,显著地提高了性能,或者整个网站可以缓存到内存中。它还可以使代码保留并委托到巨型的邻近虚拟内存块中,无需实际地担心虚拟内存碎片问题。这也考虑到了巨型文件映射对象或共享的内存部分。 下面是64 位体系结构和 32 位体系结构的比较表格:地址空间64 位 Windows32 位 Windows虚拟内存 16 TB4 GB页面文件 512 TB16 TB页面缓冲池 128 G
16、B470 MB非页面缓冲池 128 GB256 MB系统缓存 1 TB1 GB下面是Windows系列内存地址空间分配比较:六Windows 64 位版本的 C/C+ 编程164位编码指导原则Windows 64 位版本使用 LLP64 数据模型。这意味着标准 C 类型 int 和 long 保持为 32 位整数。数据类型 size_t 将映射到处理器词大小(IA32 为 32 位,IA64 为 64 位),并且 _int64 是 64 位整数。在协助迁移 32 位代码时就会完成上述操作。意义在于您可以对应用程序的 32 位版本和 64 版本使用相同的代码库。 还有一个称为 LP64 的数据模
17、型,它将标准的 C 类型 long 映射到 64 位整数,并使 int 保持为 32 位的整数。这种数据模型常见于 Unix 平台,但从单个代码库同时创建应用程序的 32 位和 64 位版本时可能有一些困难。您可能注意到了此处的常见主题。32 位平台与 64 位平台的思想就是应该能够从单个代码库中构建两个版本的应用程序。如果无法做到,那么您可能要重新审视您的设计。具有单个代码库就是巨大的胜利,尤其是如果您计划发行两个版本。 综合以上考虑,建议如下:l 使用Windows64位或32位安全数据类型;l 检查所有的指针运算及使用指针的地方;改写所有嵌入的汇编代码;使用intrinsics或者nat
18、ive assembly code;l 对于X64相关代码使用 #if defined (_AMD64_) 的预编译命令(没有定义_IA64_宏);l 对于IA64相关的代码使用#if defined (_IA64_)命令;l 编译x64程序使用AMD64处理器;用 Visual C+ 创建在 64 位 Windows 操作系统中运行的应用程序时,应注意以下问题: l 在 64 位 Windows 操作系统中,int 和 long 是 32 位值。 l 在 64 位 Windows 操作系统中,size_t、time_t 和 ptrdiff_t 是 64 位值。 l 在 32 位 Window
19、s 操作系统中,time_t 是 32 位值。 l 应注意代码在哪里采用 int 值和将其作为 size_t 值或 time_t 值处理。数字有可能增长得比 32 位数大,并且数据在被传递回 int 存储时有可能被截断。 l %x(十六进制 int 格式)printf 修饰符在 64 位 Windows 操作系统中不按预期的那样工作;它只对传递给它的值的前 32 位进行操作。 l Windows 32 位操作系统使用 %I32x 显示整数。 Windows 64 位操作系统使用 %I64x 显示整数。 l %p(指针的十六进制格式)在 64 位 Windows 操作系统中按预期的那样工作。2/
20、WP64:使编译器警告您潜在的问题Microsoft_ Visual C 和 Microsoft_ Visual C+_ .NET 2002 编译器添加了 /WP64 开关,这使您可以测试 32 位代码的 64 位兼容性问题。编译器将发出有关指针截断和不正确转换的警告。将 32 位应用程序迁移到 Windows 64 位版本中前面的一个步骤就是打开这个标记,然后就像通常编译代码那样来编译您的代码。第一次会有几个错误。例如,请看下面这个代码片段:DWORD i = 0;size_t x = 100;i = x; / C4267: warning C4267: = : conversion fro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 32 应用程序 64 迁移

限制150内