《Windows 64位架构及其开发》学习笔记

Windows 64位架构及其开发

为什么要用64位呢?

Techniques Benefits

Business Benefits

Eg:数据仓库(DW)的应用

发展趋势及其微软的支持

支持的体系结构:

X64:64-bit扩展     IPFItanium Processor Family

          让我们来看看安腾系列的架构

          我想大家也已经知道,微软公司已经推出了一款基于安腾的Windows 2003操作系统,这其中包括了企业版和数据仓库版。

          显示并行指令集,顾名思义,它是为并行处理所设计的一套新的指令集。支持同时执行9个并发的指令。

          最多支持512个处理器

          具有大量的寄存器,特别是浮点寄存器,使得安腾架构成为浮点运算的最佳选择

          运行在Windows的平台上,代给客户们最高级别的性能和可扩展性

          相对于运行UnixRISC(精简指令集)架构,这也是一个既划算,有可以获得同样高性能的解决方案

          我们在来看看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同时支持IntelEM64T处理器和AMDOpteronAthlon 64 (AMD64)

再来回顾一下为什么我们要迁移到x64 Windows

1)    更快的文件I/O64-bit架构充分利用了巨大的数据模块

2)    高达16TB的虚拟内存可以供应用程序使用

3)    更多的并发进程也就意味着更高的数据传输速率

4)    更多的并发客户端连接也就意味着更高的事务处理效率

5)    64位的文件系统也就有可能实现多个exabyte大小的文件 An exabyte = 1 billion GB

6)    可以看到,虚拟内存从32Windows上的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

          WOW64x64 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注册和应用程序的状态并存,WOW6432为应用程序呈现了一个不同视图的注册表。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. 指针的大小改变了,因为在64Windows中,寻址是64位了,所以指针,句柄等都变成了64位,而这一点也是导致所谓的编写不好的”32位应用程序无法在64Windows上运行的主要原因。在捎后的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

 

 

相关资源

*       64Windows社区

*      http://www.route64.net/resources.aspx

*       64位应用程序在64Windows上的开发指南

*      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

*      http://www.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

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值