目前最流行的两种64bit微处理器架构: IA-64 Intel 64
IA-64 : 由Intel和Hewlett Packard公司联合开发,被使用在 Itanium和 Itanium 2微处理器之上。
Intel 64 :又称EM64T / AMD64 / IA-32e / x86-64 /AA-64/ x64/Hammer Architecture,是对原来x86架构的64位扩展,具有向后兼容性。
这两种架构是绝对不同的,不具有相互兼容性。下面以Intel 64在windows平台的情况进行介绍,将其称之为win64。
-------
64位架构有如下优势:
(1)64位地址总线空间 (这意味着程序可以使用更多内存)
(2)兼容32位应用程序
(3)兼容32位操作系统
-------
现代64位的操作系统,并不是所有的模块都是64位的。为了能使32位的程序能运行在win64之上,需要开启WoW64模式(Windows On Windows 64)。
『注:该模式为当前64位操作系统的缺省模式』WoW64为windows上的一个子系统,能使32位程序运行在win64之上。
注:win64不再兼容16位程序的运行;其内核模块必须是64位的,用户模块可以是32位的。
64位地址总线空间,理论上可寻址的内存地址空间可达2^64=16EB,但实际肯定没这么多。
目前,各版本的64位Windows能管理的内存数如下:
win64的程序模型
(1)内存页的大小和win32保持一致,为4KB.
(2)地址空间的前64KB,不可用; 即系统最低的内存地址为0x10000
(3)函数的参数不再通过stack来传递(直接通过寄存器来传递),这就意味着不再有调用约定(__stdcall, __cdecl, __fastcall等)
这个不同决定了不可能在一个程序中既有32位的模块,又有64位的模块。因此,64位的程序不能加载一个32位的动态连接库,然后执行它的代码。
++
□ 32位程序在win64上使用更大内存需要开启链接参数 /LARGEADDRESSAWARE 这样该程序在win64可使用大约为4GB的内存.(实际通常为3.5GB左右)
□ 64位程序可以通过代理进程和COM技术来访问32位DLL 具体可参看这篇文章 Accessing 32-bit DLLs from 64-bit code
然而,可以比较容易地将32位DLL中资源加载到64位程序中 -- 在LoadLibraryEx时指定LOAD_LIBRARY_AS_DATAFILE标志。
ILP32和LP64数据模型
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。
而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。
关于更多64位平台的知识请参考:http://www.viva64.com/en/l/
http://software.intel.com/en-us/articles/lessons-on-development-of-64-bit-cc-applications/