Windows 64位架构及其开发
为什么要用64位呢?
Techniques Benefits
Business Benefits
Eg:数据仓库(DW)的应用
发展趋势及其微软的支持
支持的体系结构:
X64:64-bit扩展 IPF:Itanium Processor Family
• 让我们来看看安腾系列的架构
• 我想大家也已经知道,微软公司已经推出了一款基于安腾的Windows 2003操作系统,这其中包括了企业版和数据仓库版。
• “显示并行指令集”,顾名思义,它是为并行处理所设计的一套新的指令集。支持同时执行9个并发的指令。
• 最多支持512个处理器
• 具有大量的寄存器,特别是浮点寄存器,使得安腾架构成为浮点运算的最佳选择
• 运行在Windows的平台上,代给客户们最高级别的性能和可扩展性
• 相对于运行Unix的RISC(精简指令集)架构,这也是一个既划算,有可以获得同样高性能的解决方案
• 我们在来看看x64这个架构
• 首先,64位扩展的处理器有2种,intel所推出的这款称为EM64T
• 微软公司的Windows也将支持x64这种架构
• X64是扩展了x86的指令集,同样多出了一些寄存器用于浮点运算,并且突破了x86指令集的 4G 内存的限制,使得计算机的整体性能提高。
• 同时,x64有一个很大的优点,就是它对现有的32位应用程序具有良好的支持,使得客户可以充分利用现在在32位上的投入。
趋势:
主流:x86-32
通用:x64
最具:最具扩展性Itanium
Windows 64位架构及其特性
X64是一个术语,它是指扩展了x86指令集到64位,同时还能象原来的x86处理器一样运行32位操作系统和应用程序的体系架构
64-bit Windows for x64同时支持Intel的EM64T处理器和AMD的Opteron和Athlon 64 (AMD64)
再来回顾一下为什么我们要迁移到x64 Windows:
1) 更快的文件I/O:64-bit架构充分利用了巨大的数据模块
2) 高达16TB的虚拟内存可以供应用程序使用
3) 更多的并发进程也就意味着更高的数据传输速率
4) 更多的并发客户端连接也就意味着更高的事务处理效率
5) 64位的文件系统也就有可能实现多个exabyte大小的文件 (An exabyte = 1 billion GB)
6) 可以看到,虚拟内存从32位Windows上的4GB增加到16TB
7) 此外,paging file size也从64GB增加到512TB,因为,这也就增加了与内核共同运行的进程数量
8) 正如你所看到的,所有的系统资源都有显著地增加
x64 Windows不再支持的特性
1. 首先16位应用程序不能在x64 Windows上运行。最主要的原因:在32位系统中,NTVDM/WOW32将窗口句柄和其他类型的句柄截断,从32位变成16位, 所以他们能够被传递给16位的代码。在64位的Windows中,窗口句柄和其他句柄都被重新定义了,他们有32位有效位,而不能在不丢失数据的情况下被截断成16位。
2. DOS也将不在被支持
• …….
3. 一些传统的但很老的传输协议也将不在被支持,比如AppleTalk,现在的开发商都支持比较公开的标准的协议,有助于系统间的互连,互操作。所以我们也将不再支持老的遗留下来的协议
对32位应用程序支持
新的子系统的加载Windows 32 on Windows 64 (WOW64)
绝大部分的32位应用程序可以直接运行在x64 Windows上
² 16位应用程序不能运行
² 32位内核模式的驱动不能运行
² “bad behavior”应用程序
² Windows On Windows 64-bit (WOW64)
² WOW 64是一个x86的模拟器。32位应用程序运行在它之上,它在把它转换到内核去。
² 有一点需要强调的是,它是专门设计用来运行软件公司师和计算机使用者所需要的32位客户端应用程序的,而不适用于32位的服务器端软件。
² WOW 64的初始化和运行对于终端用户都是透明的,这个子系统将32位应用程序和64位应用程序隔离开来,这包括文件系统和注册表冲突。
² 它还位32位和64位应用程序提供了交互性操作,比如剪贴,复制等操作,或者COM。然而,有一点要注意,32位的进程是不能加载调用64位的动态连接库,反之毅然
² 绝大部分32位应用程序是可以运行的
² WOW64对于终端用户来讲是透明的,终端用户不会察觉到这个应用程序是32位的,并且运行在WOW64上面。不过,用户可以通过使用任务管理器或者是dumpbin.exe程序来确认当前的应用程序是32位的还是64位的
WOW64
• WOW64在x64 Windows上运作的方式与IPF上有所不同
• 因为x64是专门为了让32位应用程序兼容的,所以在性能方面不会有所降低
• 而在IA64上,会有一个执行层来做转换,将32位二进制代码进行转换,使其可以运行在EPIC平台上
• 在多数情况下,32位应用程序运行在安腾2上,都会稍慢一些,原因就在于这个执行层
• 正如我在上节Roadmap中所提到的那样,你的特殊的需求和规格,决定了哪种处理器更适合您。当CPU确定了,选择那种架构的Windows也就确定了
• 文件系统重定向
64位应用程序也不会来干扰32位应用程序的文件系统和注册表
File System Redirector:
The %systemroot%/System32 目录为64-bit应用程序预留了. 大部分的动态连接库文件名字都不会改变,所以32位的应用程序必须用不同的目录作为他们原有的system32目录。WOW64使用文件系统转向器来隐藏了这个细节。
当一个32为应用程序视图访问%systemroot%/System32, 访问将会被重定向到一个新的目录%systemroot%/SysWOW64. 如果想要得到32位的系统目录名称,64位应用程序应该是用GetSystemWow64Directory 函数.
WOW64并不重定向 %ProgramFiles%目录. 应用程序应该使用SHGetSpecialFolderPath 函数来取得目录名称
为了帮助应用程序将REG_EXPAND_SZ键写到包含 %ProgramFiles% 的注册表中, WOW64 截获这些写请求并且将其代替位“%ProgramFilesx86%”. 这个环境变量是为所有进程定义的。例如,如果Program Files 目录在C盘, 那么“%ProgramFilesx86%” 扩展成 "C:/Program Files (x86)".
然而一些特定的子目录并不会被重定向:
%windir%/system32/drivers/etc
%windir%/system32/spool
%windir%/system32/catroot
%windir%/system32/catroot2
Registry Redirector:
为了支持32位和64位的COM注册和应用程序的状态并存,WOW64为32为应用程序呈现了一个不同视图的注册表。32位的应用程序看到的HKEY_LOCAL_MACHINE/Software是和真正的分开的,它位于一个单独的节点下面,也不在HKEY_CLASSES_ROOT节点下面。HKEY_LOCAL_MACHINE/Software/WOW6432Node
为了使得应用程序通过COM和其他机制实现互操作,WOW64使用注册表转向器在2个注册表视图间复制特定的健和键值。 This redirection is completely transparent and seamless 不过编写不好的程序会受到影响,比如hardcode键的名字
• 包括我们在上页提到的文件系统重定向,这些重定向都是透明的,无缝的。对于开发人员来讲,不需要额外的工作。当然,你得使用正确地方式来访问文件系统和注册表。比如:不能硬编码….有些兼容性的问题就是由于硬编码所造成的。
基于x64 Windows的应用开发
使用编译器开关 (-Wp64)
在64位中的一些不同 – LLP64
T *, size_t: 64 位
int, long: 内建的数值都是32位的
long long: 永远是64位
同一个进程中不能混合64位和32位的代码
使用几乎与Win32相同的API
除了少数几个API不同之外(如GetClassLong/SetClassLong(_ptr))
1. 首先,告诉大家一个好消息,Windows 64位编程和Win32编程没有什么差别
2. 很小一部分的API改变了,比如….ptr, 参数的类型的改变
3. 几乎所有的原有的32位数据类型还是保持32位,比如….
4. 指针的大小改变了,因为在64位Windows中,寻址是64位了,所以指针,句柄等都变成了64位,而这一点也是导致所谓的“编写不好的”32位应用程序无法在64位Windows上运行的主要原因。在捎后的Porting中,我会讲解到具体的例子。
5. 很多人问我:我的64位应用程序可以调用32位的dll嘛?或者反过来呢?很遗憾,在同一个进程中,是不能同时存在64位和32位的动态链接库的。那么有什么办法嘛?答案是肯定的。
当前的开发模型
- 在这里开发和测试32位代码
- 跨平台编译成64位二进制文件
- 把可执行文件发送到64位机器
64位和32位互操作
1. C++ compilers targeting X64,包含在随x64 Windows一起的SDK中
2. 可以在64位上编译的应用程序也可以在32位上编译,没有语法错误,没有逻辑错误
为什么要移植
Ø x64 Windows不支持16位, Windows 3.x utilities, OS/2, POSIX
Ø 32-bit安装程序不不能够加载并注册64位的动态链接库,反之亦然
Ø 内核模式的代码必须是64位的
Ø “书写不好”代码
Ø 一些OS API改变了
Ø 同一个进程不能混合32位和64位的动态链接库
• Before you begin porting your application there are some essential questions that you need to ask:
• How will the architecture of the application impact the migration?
• What technologies are integrated that will need special attention? COM? COM+? .NET?
•
Are there any 3rd party dependencies that need to be ported? Keep in mind that 64 bit processes can not load 32 bit libraries or DLL’s
• One fact that is in stark contrast to the migration of 16-bit to 32 bit is that it is not necessary to port all of your code to 64-bit
• You should analyze carefully what parts of your application will benefit from 64-bit
• It may be impractical to fully port all components and applications to 64-bit because of restrictions such as resource constraints, unavailable or lost source code or dependencies not available in 64-bit.
• Let’s take a look at a sample 32 bit C++ application using older technology such as ISAPI extensions and Com. This is an MSDN Nile application.
As a suggestion to developers, it is not necessary to port all components of an application to 64-bit.
• Some components can remain 32-bit for different reasons like sources unavailable (like third party libraries or who knows, even lost sources) or maybe there’s a deadline to meet or not enough resources available.
Obtainded from:
Wow64Overview - Updated.doc
Prepare for compoents
It is possible, however:
It may be impractical to fully port all components and or applications to 64-bit
Some components may remain as 32-bit
Resource constraints (time, budget, manpower, …)
Source code unavailable
Dependencies may not be available in 64-bit
Be very careful with dependencies
相关资源
64位Windows社区
http://www.route64.net/resources.aspx
64位应用程序在64位Windows上的开发指南
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/introducing_64_bit_windows.asp
Microsoft eLearning 教程
http://msdn.microsoft.com/elearning/courses/64-bit/standlaunch.html
64位的.NET Framework开发人员中心
http://msdn.microsoft.com/netframework/programming/64bit/default.aspx
Devx.com
64位开发窍门
http://www.microsoft.com/whdc/winhec/partners/64bitAMD.mspx
内核模式的驱动开发
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/64bitamd_6ec00b51-bf75-41bf-8635-caa8653c8bd9.xml.asp