ARM处理器指令集
- 苹果模拟器指令集:
|指令集|分析|
|---|----|---|
|i386
|针对intel通用微处理器32
架构的|
|x86_64
|针对x86架构的64
位处理器|
i386
|x86_64
是Mac处理器的指令集,i386
是针对intel通用微处理器32
架构的。x86_64
是针对x86
架构的64
位处理器。
模拟器
并不运行arm
代码,软件会被编译成x86
可以运行的指令。所以生成静态库时都是会先生成两个.a
,一个是i386
的用于在模拟器
运行,另一个是在真实设备
上运行的,然后再用命令将两个.a
合并成一个(1+1=1
)。
- 苹果设备指令集相关
位数 | 指令集 |
---|---|
32 位ARM
|
armv6 、armv7 、armv7s
|
64 位ARM
|
arm64 、armv8
|
苹果A7 处理器支持两个不同的指令集:32位ARM 指令集(armv6|armv7|armv7s )和64位ARM 指令集(`arm64 |
armv8`)。 |
指令集 | 支持设备 |
---|---|
armv6 设备 |
iPhone , iPhone2 , iPhone3G ; <br /> <br />第一代、第二代 iPod Touch |
armv7 设备 |
iPhone3GS , iPhone4 , iPhone4S ; <br /> </br> iPad, iPad2, iPad3(The New iPad), iPad mini; </br> iPod Touch 3G, iPod Touch4 |
armv7s 设备 |
iPhone5 , iPhone5C , <br /><br />iPad4(iPad with Retina Display) |
ARMv8 /arm64 设备 |
iPhone5S ,iPhone6s(plus) 、iPhoneSE ,iPhone7(plus) <br /><br /> iPad Air, iPad mini2(iPad mini with Retina Display) |
- 苹果模拟器、设备指令集总结
模拟器 | 设备 |
---|---|
x86 <br />(i386 、x86_64 ) |
arm <br />(armv6 、armv7 、armv7s 、armv8 、armv64 ) |
当使用iOS模拟器的时候会遇到i386
|x86_64
,iOS模拟器没有arm
指令集,编译运行的是x86指令集
,所以,只有在iOS设备
上,才会执行设备对应的arm指令集
。
XCode中与指令集相关
XCode中关于生成二进制包指令集相关的设置项有以下三个:
Xcode设置项 | 定义 | 注意事项 |
---|---|---|
Architecture |
指你想 支持的指令集<br /><br /> |
该选项指定了工程将被 编译成支持哪些指令集 。<br /><br />如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,从而会造成最终编译生成的包很大 。 |
Valid architectures |
指即将 编译的指令集 |
该选项指定可能 支持的指令集,该Valid architectures列表 和Architectures列表 的交集 ,将是Xcode最终生成二进制包所支持的指令集<br /><br />限制 可能被支持的指令集的范围 <br /><br />例如:<br />Valid Architectures 设置的支持arm 指令集有:armv7/armv7s/arm64 ,对应的Architectures 设置的支持arm 指令集有:armv7s ,这时Xcode只会生成一个armv7s 指令集的二进制包 |
Build Active Architecture Only |
该编译项用于设置是否只 编译当前使用的设备 对应的arm指令集 。 |
使用条件:<br />①其值设置为YES ;<br />②XCode 成功连接调试设备 ;<br />(必须同时 满足才会起作用)<br /><br />Xcode中设置:<br />①设置为Yes , 编译速度更快 ,它只编译当前的architecture 版本;<br />②设置为No ,编译速度更慢 会编译所有 的版本<br />例如:<br />当该选项设置成YES 时,你连上一个armv7 指令集的设备 (iPhone5、5c),就算你的Valid Architectures 和Architectures 都设置成armv7/armv7s/arm64 ,还是依然只会生成一个armv7 指令集的二进制包。 |
假定:我们将Build Active Architecture Only
值设置为YES
,同时Xcode
连接上手机iPhone5S
匹配指令集arm64
)。如下五种
情况总结如下表:
情况 | Architectures | ValidArchitectures | 结果 | 分析 |
---|---|---|---|---|
情况① | armv7、armv7s 、arm64
|
armv6、armv7s 、arm64
|
arm64 |
因为:<br />取交集arm64 和 armv7s ,但iPhone5S 匹配指令集arm64 ,<br /><br />所以:<br />为arm64
|
情况② |
armv6 、armv7、 armv7s
|
armv6 、armv7s 、arm64 |
armv7s |
<br />因为:<br />取交集armv6 和armv7s ,但iPhone5S 匹配指令集arm64 ,但同时支持armv7s ,同时XCode4.5 开始,就不 再支持armv6 指令集<br /><br />所以:<br />为arm64
|
情况③ | armv6 armv7 |
armv6、 armv7s、 arm64 |
armv7 |
无交集。<br /><br />但是因为:ValidArchitectures 支持armv7s 则必然支持armv7 ,Architectures支持armv7,从XCode4.5 开始,就不 再支持armv6 指令集。<br /> <br />所以:<br />最终生成二进制指令集armv7
|
情况④ | armv6 | armv6、 armv7s、 arm64 |
<br />无响应 | 虽然编译 成功了,但是并没有 任何目标生成 。<br /> 因为从XCode4.5 开始,就不 再支持armv6 指令集,所以列表中写了也是白写。 |
情况⑤ | armv7、 armv7s、 arm64 |
armv7、 armv7s |
error报错 | 生成二进制包支持的指令集编译出错error 信息:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7
|
- 分析:
- 当
Build Active Architecture Only
起作用时:连接的手机指令集匹配是由高到低(arm64 > armv7s > armv7
)依次匹配的。 - 指令集都是可以
向下兼容
的
比如,你的设备是armv7s
指令集,那么它也可以兼容运行比armv7s
版本低的指令集:armv7、armv6
xcode
对armv6
指令集的支持 -
Xcode4.5
起不
再支持armv6
。
如何选择支持的指令集
?
如果你的软件对安装包大小非常敏感,你可以减少安装包中的指令集数据包,而且这能达到立竿见影的效果。
很久前xcode
支持的指令集是armv7/armv7s
,后来改成只支持armv7
后,比原来小了10MB
左右。目前AppStore上的一些知名应用,比如百度地图、腾讯地图通过反汇编工具查看后,也都只支持armv7
指令集。
根据向下兼容原则,armv7
指令集的应用是可以正常在支持armv7s/arm64
指令集的机器上运行的。
不过对于armv7s/arm64
指令集设备来说,使用运行armv7
应用是会有一定的性能损失
,不过这种损失有多大缺乏权威统计数据,不会影响用户体验的。
建议:Valid Architectures通常Debug
模式设置值为Yes
,Release
模式设置为No
参考链接:
1.armv6, armv7, armv7s的区别
2.Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
3.Xcode设置项之Architectures和Valid Architectures
4.iOS工程如何支持64-bit
网友评论