x86/x86_64的一些基本概念

最后都变了- 提交于 2019-11-26 17:34:32

本人在构建boost的时候,从"Start Menu" -> "Programs" -> "Visual Studio 2015" -> "Visual Studio Tools" -> "Windows Desktop Command Prompts":
    VS2015 x64 ARM Cross Tools Command Prompt.lnk
    VS2015 x64 Native Tools Command Prompt.lnk
    VS2015 x64 x86 Cross Tools Command Prompt.lnk
    VS2015 x86 ARM Cross Tools Command Prompt.lnk
    VS2015 x86 Native Tools Command Prompt.lnk
    VS2015 x86 x64 Cross Tools Command Prompt.lnk

开始郁闷于
    VS2015 x64 Native Tools Command Prompt.lnk
    VS2015 x64 x86 Cross Tools Command Prompt.lnk

此两者的区别。

区别在这里
    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64
    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64_x86

而vcvarsall.bat内容如下

    @echo off
    if "%1" == "" goto x86
    if "%2" == "" goto check_platform
    if not "%2" == "store" goto usage
    :check_platform
    if /i %1 == x86       goto x86
    if /i %1 == amd64     goto amd64
    if /i %1 == x64       goto amd64
    if /i %1 == arm       goto arm
    if /i %1 == x86_arm   goto x86_arm
    if /i %1 == x86_amd64 goto x86_amd64
    if /i %1 == amd64_x86 goto amd64_x86
    if /i %1 == amd64_arm goto amd64_arm
    goto usage
    :x86
    if not exist "%~dp0bin\vcvars32.bat" goto missing
    call "%~dp0bin\vcvars32.bat" %2
    goto :SetVisualStudioVersion
    :amd64
    if not exist "%~dp0bin\amd64\vcvars64.bat" goto missing
    call "%~dp0bin\amd64\vcvars64.bat" %2
    goto :SetVisualStudioVersion
    :arm
    if not exist "%~dp0bin\arm\vcvarsarm.bat" goto missing
    call "%~dp0bin\arm\vcvarsarm.bat" %2
    goto :SetVisualStudioVersion
    :x86_amd64
    if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
    call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
    goto :SetVisualStudioVersion
    :x86_arm
    if not exist "%~dp0bin\x86_arm\vcvarsx86_arm.bat" goto missing
    call "%~dp0bin\x86_arm\vcvarsx86_arm.bat" %2
    goto :SetVisualStudioVersion
    :amd64_x86
    if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
    call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
    goto :SetVisualStudioVersion
    :amd64_arm
    if not exist "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" goto missing
    call "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" %2
    goto :SetVisualStudioVersion
    :SetVisualStudioVersion
    set VisualStudioVersion=14.0
    goto :eof
    :usage
    echo Error in script usage. The correct usage is:
    echo     %0 [option]
    echo   or
    echo     %0 [option] store
    echo where [option] is: x86 ^| amd64 ^| arm ^| x86_amd64 ^| x86_arm ^| amd64_x86 ^| amd64_arm
    echo:
    echo The store parameter sets environment variables to support
    echo   store (rather than desktop) development.
    echo:
    echo For example:
    echo     %0 x86_amd64
    echo     %0 x86_arm store
    goto :eof
    :missing
    echo The specified configuration type is missing.  The tools for the
    echo configuration might not be installed.
    goto :eof

也就是说,区别在于

    :x86_amd64
    if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
    call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
    goto :SetVisualStudioVersion


    :amd64_x86
    if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
    call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
    goto :SetVisualStudioVersion

之间

亦即
    x86_amd64\vcvarsx86_amd64.bat

    amd64_x86\vcvarsamd64_x86.bat
之间的区别

用beyond compare比较它两,差不多两百行的脚本比较,我就傻在这里了 ...

然后我查有关计算机体系架构的资料,有太多似是而非或者聊当放屁的“文章”,而以下一文对我有些许帮助:

现在的x86 CPU在位数上有32/64bit之分,在ARCH上有又x86/x86_64/x64/i386/IA32/IA64/amd64,最近又新出来一个x32,还好不是ARCH,只是ABI,没有那么混乱。


先说一下x86的这些arch,不要求很严格的话,基本上可以用下面的公式来表达:

x86=i386=IA32

amd64=x86_64=x64!=IA64

其实这两个等式里很多都是别名,严格说的话,x86的世界里只存在x86/x86_64/IA64三种架构。

当年AMD先于Intel推出向下兼容的amd64 CPU,而Intel推出的不兼容32位系统的IA64惨淡收场(被MS放了鸽子),后来Intel在指令上支持了amd64,不过不愿意叫amd64,改了个名字x86_64。


再说64bit/32bit的兼容性问题:

现在的64bit CPU实际上都做了兼容32bit的特殊设计,所以64bit的CPU上运行32bit的软件(包括kernel/app, driver除外)是没有问题。反过来,32bit的CPU上运行64bit的软件是不可以的。


最后说重点,64bit相比32bit的性能优势:

这里不考虑64bit硬件上运行32bit软件的这种过度方式。

从架构上来说,64bit拥有64bit 的register和64bit的bus,在数据传输效率上比32bit要高不少;另外,64bit地址总线的寻址空间突破了4G的限制。

所以,对于大内存,密集数据运算的应用场景,64bit的优势是非常明显的。网上有一些benchmark,这里不贴了。


但是,对于小内存系统,64bit的CPU在某些状况下可能比32bit CPU的效率更低。

因为64 bit的CPU的地址是64位的,指针是64位的,编译生成的二进制文件更大,运行时占用的内存更多;另一方面,因为64位地址的问题,cache中能存放的指令就更少,所以更容易导致cache的miss。


所以在某些应用场景,64 bitCPU的更大的寻址空间,更快的数据传递,更快的浮点运算的特性, 与其64 bit的地址/指针所导致的cache miss的特性,始终并存。


为了充分利用64的优势,又避免64bit地址导致的cache miss的问题,Intel提出了x32 ABI的概念。

x32不是一个ARCH,是一个ABI。

x32可以充分的使用64 bit硬件的64 bit寄存器,64bit总线,以及64bit新增的指令,从而获得更快的数据处理速度。

同时x32又使用32bit的地址/pointer,32bit的C数据类型,因此cache miss并不会增加。


x32是一个ABI,其设计到的部分包括:kernel的support,toolchain的support,system lib的support。现在kernel(from 3.4)和toolchain的support都已经OK。



refrence:

http://blog.claudxiao.net/2012/05/x32-abi/

http://blog.csdn.net/force_eagle/article/details/7860574


但就算看到如此,我还是没有搞懂
    x86_amd64\vcvarsx86_amd64.bat

    amd64_x86\vcvarsamd64_x86.bat
之间的区别


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!