从32位程序开发进入64位程序开发

2005年Windows XP x64版刚推出来的时候,做过金山网镖和金山毒霸的64位移植,当时最小的移植过程就是把驱动从32bit移植为原生的64bit驱动(因为x64的Windows只能加载原生的64位驱动),其他的就是32位和64位通信接口的兼容。

当时做完移植后,总结了一下,在Windows上面32位与64位的区别有:
1.指针大小的区别,sizeof(int *)在32bit下面是4个字节,在64bit下面是8个字节
2.size_t的区别,size_t在32bit下面是4个字节的范围,在64bit下面是8个字节的范围
3.地址空间的区别,在32bit下面,最大地址空间是4GB,在64bit下面是可以大于4GB的
4.32位程序在64位Windows上运行,是有一个Wow64子系统辅助其运行的,默认情况下,访问注册表和某些文件夹是被重定向的
5.指针的区别也意味着Handle的区别
6.唯一支持Windows原始64位编译的msvc编译器不支持64bit的内联汇编,如果要用汇编,需要单独编译再link
7.纯64bit程序的函数调用方式已经不再区分cdecl和stdcall方式,因为只有一种了。
8.64bit的程序不再使用esp,而是使用增加的几个64bit寄存器,因为esp不支持64bit空间的栈

最近的工作涉及到Linux的64位工作,发现当初对32位和64位区别的认识还不够:
1.long在Windows下面,不管是32bit还是64bit下,都是4个字节的,但在Linux下面,32bit下是4字节,在64bit下是8个字节。(long long在64bit下还是8个字节)
2.gcc在64bit下面,不再支持__attribute((cdecl))__和__attribute((stdcall))__,这点和Windows有点类似,开始以为是gcc的高版本不支持的,后来发现区别在x86和x64

你可能感兴趣的:(从32位程序开发进入64位程序开发)