windows 10是如何做到全平台统一的?
1、EXE本身就是个容器,它可以在ARM平台上包含ARM的native code执行,也可以在x86平台上包含x86的native code执行,本质上无差别(所以麻烦那些说EXE不能在ARM平台上运行的同学自删答案可以吗?)。
2、APPX文件里并不包含字节码,而是各种架构的native code的混合物,微软确实想用.net的字节码来统一天下,但现在大部分APPX文件都是native code。
-------------------------正文-------------------------
从原理上说,一个操作系统能同时在不同的平台上运行“相同”(注意引号)的代码,无非有两种形式:
1、学Java那样,做字节码,然后解释执行,只需要在不同平台上做好解释器即可;
2、如果要同时支持x86平台和ARM平台,那么就同时发布两个版本的二进制文件,然后封装到一起就好了;
你们觉得微软会那种方式呢?
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
当然是第二种了!微软自古以来兼容性的包袱都非常,你们以为微软可能会彻底从写一个平台把上万个WindowsAPI用Java或者别的什么语言重新封装一次?别做梦了。
你们以为Windows能在ARM上运行肯定是微软搞了什么黑科技吧?其实只不过是把目标文件设置成ARM格式然后重新把Windows编译一遍而已,arch相关的部分要重新实现一下就OK了。也就是说在ARM上运行的Windows,用的就是ARM的硬件指令,根本没有什么黑科技。N年前就有人试过,把Windows改成Java的话效率会降低到原来的三分之一(不对这句话真实性负责)。
然后有人会举手提问说:唉?不对啊,Windows不是出了一种新的格式叫APPX吗?不是号称这种格式跨平台吗?好吧,让我们来揭开APPX文件格式的神秘面纱:
APPX在维基百科(APPX)上的解释如下:
其中侧栏特意标注了一下:
明白了吗?APPX本质就是一个打包好的可执行文件的容器,这个容器里你放什么东西都行。还不相信?那我举例来证明,我刚到某手机论坛上下载了一个破解的WP应用,刚下载下来是这样的:
果然有appx文件:
看看这是什么啊:
打开这个EXE看看真相吧:
居然连Dos Stub头都有。
注意在偏移量0x100的地方有个PE头的东西,0x104位置上是0x01C4,这是什么东西呢?在微软的SDK里是有解释的:
0x01c4 - ARMv7 (or higher) Thumb mode only
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70569.html