Architectures与指令集架构armv6,armv7,armv7s,arm64,i386,x86_64
簡介
前些天遇到的關于iPhone模擬器CPU架構不支持的問題, 今天來徹底的說一說關于iPhone真機和模擬器的CPU架構或指令集架構。還要說一說Xcode中BuildSetting中的Architectures, Valid architectures, Build Active Architecture Only的配置項。
iPhone的CPU
Arm處理器,因為其低功耗和小尺寸而聞名,幾乎所有的手機處理器都基于arm,其在嵌入式系統(tǒng)中的應用非常廣泛,它的性能在同等功耗產品中也很出色。蘋果手機使用的CPU是自主研發(fā)的,所用指令集架構arm公司的。
iPhone7搭載64位第三代的A10處理器,iPhone6s, iPhone SE搭載64位第二代的A9處理器,iPhone6搭載64位第一代的A8處理器, iPhone5s處理器架構是64位armv8。 其實iPhone 5s用的指令集架構其實是64位的armv8, 從iPhone 6開始(即從蘋果自主研發(fā)第一代的A8開始) iphone手機的架構都是arm64了, 具體的是什么指令集就不得而知了。
iPhone真機的CPU架構
iPhone的CPU架構一般是指iPhone手機CPU的指令集架構。 armv6、armv7、armv7s、arm64都是arm處理器的指令集,所有指令集原則上都是向下兼容的,如iPhone4S的CPU默認指令集為armv7指令集,但它同時也兼容armv6指令集,只是使用armv6指令集時無法充分發(fā)揮其性能,即無法使用armv7指令集中的新特性,同理,iPhone5的處理器標配armv7s指令集,同時也支持armv7指令集,只是無法進行相關的性能優(yōu)化,從而導致程序的執(zhí)行效率沒那么高。
從iPhone 5s開始就摒棄了32位CPU架構了, 而是采用了64位CPU架構。
- arm64: iPhone 5s, iPhone 6(Plus), iPhone 6s(Plus), iPhone SE, iPhone 7(Plus), iPad Air(2), Retina iPad Mini(2,3)……
- armv7s: iPhone 5, iPhone 5c, iPad 4
- armv7: iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
- armv6: iPhone, iPhone 3G, iPod 1G/2G
iPhone模擬器的CPU架構
模擬器32位處理器測試需要i386架構,iPhone5及之前設置:i386。
模擬器64位處理器測試需要x86_64架構,iPhone5s及之后設備。
前陣子QQ分享不在支持i386架構了, 所以造成運行iphone5以下的模擬器時, 會報 “Undefined symbols for architecture”的錯誤, 原因就如此。 具體的看已查看我的另一篇博客: 錯誤總結:Undefined symbols for architecture
Xcode中配置 Architectures
在Xcode->BuildSetting中的Architectures, Valid architectures和Build Active Architecture Only的配置項都是涉及到架構指令集的。下面具體來說明下含義:
Architectures
這個配置項代表項目可能支持的指令集, 即支持指令集是通過編譯生成對應的二進制數據包實現的,如果支持的指令集數目有多個,就會編譯出包含多個指令集代碼的數據包,造成最終編譯的包很大。
Valid architectures
這個配置項代表將要編譯的有效指令集, 用來限制可能被支持的指令集的范圍,無錯誤前提下, Valid architectures 和 Architecture兩個集合的交集最高指令集才是最終編譯生成的版本, 即目標指令集。
舉個例子,將Architectures支持arm指令集設置為:armv7,armv7s,對應的Valid Architectures的支持的指令集設置為:armv7s,arm64,那么此時,XCode生成二進制包所支持的指令集只有armv7s。
Build Active Architecture Only
這個配置項代表是否只編譯當前設備適用的指令集, 如果這個參數設為YES,使用iPhone 6調試,那么最終生成的一個支持arm64指令集的Binary。一般在DEBUG模式下設為YES,RELEASE設為NO。
注意事項
在上面的文章中說過, 處理器的所有指令集原則上都是向下兼容的, 就像這樣 arm64 > armv7s > armv7 >armv6, 所以生成的二進制包將會支持當前支持的指令集以及比它小的指令集。
Architectures選取最高支持的指令集為目標指令集,然后和Valid Architectures取交集的最高指令集才是最終生成二進制包支持的指令集。
舉例, 以iPhone 6S為例, 設備匹配指令集是arm64。
1.生成二進制包支持的指令集等于當前設備的CPU指令集
Architectures: armv7, armv7s, arm64
Valid Architectures: armv6, armv7s, arm64
生成二進制包的目標指令集: arm64
2.生成二進制包支持的指令集小于當前設備的CPU指令集
Architectures: armv6, armv7
Valid Architectures: armv6, armv7, arm64
生成二進制包的目標指令集: armv7
3.特殊情況armv6
Architectures: armv6
Valid Architectures: armv6, armv7s, arm64
生成二進制包的目標指令集: 無
雖然編譯成功了,但是并沒有任何目標生成, 因為從XCode4.5開始,就不再支持armv6指令集,所以列表中寫了也是白寫。
4.生成二進制包出錯
Architectures: armv7, armv7s, arm64
Valid Architectures: armv7,armv7s
生成二進制包的目標指令集: 編譯出錯信息
當前設備為iPhone 6S,其默認指令集為arm64. 從Architectures中選取的目標指令集應該為arm64, 但是目標指令集并不在Valid Architectures中,所以不是有效指令集,則編譯將會出錯。
總結
以上是生活随笔為你收集整理的Architectures与指令集架构armv6,armv7,armv7s,arm64,i386,x86_64的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 分区100g整数,硬盘分区
- 下一篇: 删除 srvinstw安装的服务