處理器架構(gòu)和配置
成功之前我們要做應(yīng)該做的事情,成功之后我們才可以做喜歡做的事情。

1. 處理器架構(gòu)
CPU 架構(gòu)是 CPU 廠商給屬于同一系列的 CPU 產(chǎn)品定的一個規(guī)范,主要目的是為了區(qū)分不同類型 CPU 的重要標(biāo)示。市面上的 CPU 分類主要分有兩大陣營,一個是 intel、AMD 為首的 復(fù)雜指令集 CPU,另一個是以 IBM、ARM 為首的 精簡指令集 CPU。兩個不同品牌的 CPU,其產(chǎn)品的架構(gòu)也不相同,例如,Intel、AMD 的 CPU 是 X86架構(gòu) 的,而 IBM 公司的 CPU是 PowerPC 架構(gòu),ARM 公司是 ARM 架構(gòu)。
從 CPU 發(fā)明到現(xiàn)在,有非常多種架構(gòu),從我們熟悉的 X86、ARM,到不太熟悉的MIPS、IA64,它們之間的差距都非常大。但是如果從最基本的邏輯角度來分類的話,它們可以被分為兩大類,即所謂的“復(fù)雜指令集”與“精簡指令集”系統(tǒng),也就是經(jīng)常看到的“CISC”與“RISC”。
中央處理單元(CPU)主要由運(yùn)算器、控制器、寄存器三部分組成,從字面意思看運(yùn)算器就是起著運(yùn)算的作用,控制器就是負(fù)責(zé)發(fā)出 CPU 每條指令所需要的信息,寄存器就是保存運(yùn)算或者指令的一些臨時文件,這樣可以保證更高的速度。CPU 有著處理指令、執(zhí)行操作、控制時間、處理數(shù)據(jù)四大作用,打個比喻來說,CPU 就像我們的大腦,幫我們完成各種各樣的生理活動。因此如果沒有 CPU,那么電腦就是一堆廢物,無法工作。移動設(shè)備其實(shí)很復(fù)雜,這些 CPU 需要執(zhí)行數(shù)以百萬計(jì)的指示,才能使它向我們期待的方向運(yùn)行,而 CPU 的速度和功率效率是至關(guān)重要的。速度影響用戶體驗(yàn),而效率影響電池壽命。最完美的移動設(shè)備是高性能和低功耗相結(jié)合。
在計(jì)算世界中,“體系結(jié)構(gòu)”一詞被用來描述一個抽象的機(jī)器,而不是一個具體的機(jī)器實(shí)現(xiàn)。一般而言,一個 CPU 的體系結(jié)構(gòu)有一個指令集加上一些寄存器而組成。
2. 指令集
計(jì)算機(jī)指令就是指揮機(jī)器工作的指示和命令,程序就是一系列按一定順序排列的指令,執(zhí)行程序的過程就是計(jì)算機(jī)的工作過程。指令集,就是 CPU 中用來計(jì)算和控制計(jì)算機(jī)系統(tǒng)的一套指令的集合,而每一種新型的 CPU 在設(shè)計(jì)時就規(guī)定了一系列與其他硬件電路相配合的指令系統(tǒng)。而指令集的先進(jìn)與否,也關(guān)系到 CPU 的性能發(fā)揮,它也是 CPU 性能體現(xiàn)的一個重要標(biāo)志。指令的強(qiáng)弱也是 CPU 的重要指標(biāo),指令集是提高微處理器效率的最有效的工具之一。
直觀的解釋指令集主要是指 CPU 硬件和軟件之間的接口描述,它本質(zhì)上是一段二進(jìn)制機(jī)器碼,CPU 只能識別機(jī)器碼,但是機(jī)器碼是一串無意義的字符串,程序員很難看看懂這些語句,用它來開發(fā)軟件,所以后面就發(fā)明了匯編語言,匯編語言本質(zhì)上跟機(jī)器碼一一對應(yīng)的,現(xiàn)在有很多不同版本的匯編語言,本質(zhì)上就是有不同的指令集,指令集可以簡單的分為復(fù)雜指令集和精簡指令集。
指令集架構(gòu)是計(jì)算機(jī)體系架構(gòu)的一部分。指令集是一個很虛的東西,是一個標(biāo)準(zhǔn)規(guī)范。例如我們的交通規(guī)則,紅燈停、綠燈行、黃燈亮了等—等,只有行人和司機(jī)都去遵守這套交通規(guī)則我們的交通系統(tǒng)才能有條不紊地運(yùn)行下去。指令集也一樣,芯片工程師在設(shè)計(jì) CPU 時也要以指令集中規(guī)定的指令格式為標(biāo)準(zhǔn)實(shí)現(xiàn)不同的譯碼電路來支持指令集各種指令的運(yùn)行。指令集最終的實(shí)現(xiàn)就是微架構(gòu),就是CPU 內(nèi)部的各種譯碼和執(zhí)行電路。
編譯器廠商在研發(fā)編譯器工具或 IDE 時,也要以指令集為標(biāo)準(zhǔn)將我們編寫的 C 語言高級程序轉(zhuǎn)換為指令集中規(guī)定的各種機(jī)器指令。為什么我們編寫的高級程序經(jīng)過編譯后可以直接在 CPU 上運(yùn)行呢?就是因?yàn)?CPU 設(shè)計(jì)者和編譯器開發(fā)者遵循的是同一個指令集標(biāo)準(zhǔn),“編譯器最終編譯生成的指令”都是 CPU 硬件電路支持運(yùn)行的指令,每一種不同架構(gòu)的 CPU 一般都需要配套一個對應(yīng)的編譯器。
指令集作為 CPU 和編譯器的設(shè)計(jì)規(guī)范和參考標(biāo)準(zhǔn)主要用來定義指令的各種操作、操作數(shù)的類型、寄存器的分配、地址的格式等。
指令集也不是—成不變的也會隨著應(yīng)用需求的推動不斷迭代更新,不斷擴(kuò)充新的指令。例如 ARM 指令集從最初的 ARMv1 發(fā)展到目前的 ARMv9,一直在不斷地發(fā)展不斷添加新的指令。
3. 架構(gòu)和指令集關(guān)系?
架構(gòu)主要是指某一個處理器所使用的具體指令集,比如說 m6ull,他是基于ArmV7 架構(gòu)的,就是指它是使用 armV7 指令集,在大部分場合,架構(gòu)等于指令集。
CPU 的硬件結(jié)構(gòu),即架構(gòu),一旦確定,那么使用該架構(gòu)的 CPU 能實(shí)現(xiàn)的功能大體上是一樣的,而且去實(shí)現(xiàn)該功能的指令集也大體上一樣的。
設(shè)計(jì) CPU 架構(gòu)即決定了指令集,如 X86 指令集,是因?yàn)樵?CPU 采用了 X86 結(jié)構(gòu),所以才叫 X86 指令集;指令集是指某種架構(gòu) CPU 能實(shí)現(xiàn)的所有功能,這些功能對應(yīng)的代碼編號構(gòu)成指令集;代碼編號應(yīng)該就是指機(jī)器碼這種底層代碼,某種架構(gòu) CPU 架構(gòu)確定后,代碼編號就確定了,這些編號反映了 CPU 以什么樣的方式去執(zhí)行某些功能,決定了硬件的執(zhí)行方式;前面說這些代碼編號可能就是機(jī)器碼,機(jī)器碼就是二進(jìn)制數(shù)字,二進(jìn)制數(shù)字反映在電路上就是高低電平,從而驅(qū)動電路運(yùn)行;不同代碼編號的二進(jìn)制數(shù)字排列就不同,所以驅(qū)動電路的高低電平就不同,所以電路執(zhí)行的方式就不同。
同一個程序 -> 匯編語言 -> 不同指令集 -> 不同架構(gòu)的 CPU -> 不同的實(shí)現(xiàn)電路 -> 相同的功能。
4. Apple 處理器和配置
下面對 Apple 處理器做一個格式總結(jié),具體的發(fā)展歷程請手動 BD...
| 處理器/芯片 | 架構(gòu)、指令集 | 搭載機(jī)型 | 發(fā)布時間 |
|---|---|---|---|
| A4 | Cortex-A8 | iPhone 4 iPad 第一代、iPod touch 第四代 | 2010 |
| A5/ A5X | ARM Cortex-A9 | iPhone 4S iPad 2 / iPad 第三代 | 2012、2011 |
| A6/A6X | armv7s | A6X iPhone 5、iPhone 5C | 2012 |
| A7 | arm64 | iPhone 5S iPad Air、iPad mini 2、iPad mini 3 | 2013 |
| A8/A8X | arm64 | iPhone 6系列 iPad mini 4、iPod touch 第六代 | 2014 |
| A9/A9X | arm64 | iPhone 6s系列、iPhone SE iPad 第五代 | 2015 |
| A10/A10X | arm64 | A10 iPhone 7系列 iPad 第六代、iPod Touch 第七代、 A9X 9.7 英寸 iPad Pro、12.9 英寸 iPad Pro 第一代 / 10.5 英寸 iPad Pro、12.9 英寸 iPad Pro 第二代(2017) | 2016、2015 |
| A11 | arm64 | iPhone 8系列、iPhone X | 2017. |
| A12 | arm64e | 12.9 英寸 iPad Pro 第三代、11 英寸 iPad Pro、 iPhone XS系列、iPhone XR iPad mini 5、iPad Air 第三代 | 2018. |
| A13 | arm64e | iPad第九代(10.2英寸)、iPhone 11系列、iPhone SE第二代、iPhone SE第二代 | 2021. |
| A14 | arm64e | iPhone 12系列、iPad Air 第四代 | 2020.9 |
| A15 | arm64e | iPhone SE第三代、 iPhone 13系列 | 2022.3、2021.9 |
| A16 | arm64e | iPhone 14 Pro 和 iPhone 14 Pro Max | 2022.9 |
| A17 Pro | arm64e | iPhone 15 Pro | 2023.9 |
| M1 | arm64e | iPad Pro12.9 | 2021.4 |
| M1 | arm64e | iPad Air5 | 2022.3 |
| M2 | arm64e | iPad Pro、Mac mini | 2022.10 |
iOS 架構(gòu)配置:
處理器架構(gòu)、指令集:
- armv7|armv7s|arm64 都是 ARM 處理器架構(gòu)指令集。
- i386|x86_64 是 Mac 處理器的指令集。
這些指令集在那些設(shè)備架構(gòu)中用到?
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display) 以及更高的版本
armv7|armv7s|arm64 都是 ARM 處理器的指令集:真機(jī) 32 位處理器需要 armv7,或者 armv7s 架構(gòu)指令集、真機(jī)64位處理器需要 arm64/arm64e 架構(gòu)的指令集。
對于模擬器 x86 32 位處理器測試需要 Intel i386 架構(gòu)指令集,模擬器 64 位處理器測試需要 Intel x86_64 架構(gòu)的指令集。
i386 是針對 intel 通用微處理器 x86 架構(gòu)的 32 位處理器
x86_64 是針對 x86 架構(gòu)的 64 位處理器
i386|x86_64 應(yīng)用在 Mac 處理器的指令集
最新 M1、M2 處理器則采用的也是基于 ARM 架構(gòu)的指令集
在實(shí)際開發(fā)中的配置問題,Xcode 中指令集相關(guān)選項(xiàng)(Build Setting 中):
-
Architectures:
指定工程被編譯成可支持哪些指令集類型,而支持的指令集越多,就會編譯出包含多個指令集代碼的數(shù)據(jù)包,對應(yīng)生成二進(jìn)制包就越大,也就是 ipa 包會變大。一般設(shè)置默認(rèn)值為:
Standard Architectures (Apple Silicon, Intel) - $(ARCHS_STANDARD),在真機(jī)的編譯下實(shí)質(zhì)是(armv7和arm64)、在模擬器的時候是(x86_64、i386)。 -
Valid Architectures:
限制可能被支持的指令集的范圍,也就是 Xcode 編譯出來的二進(jìn)制包類型最終從這些類型產(chǎn)生,而編譯出哪種指令集的包,將由 Architectures 與 Valid Architectures(因此這個不能為空)的交集來確定。Xcode 12 以前,我們通過 Valid Architectures 來配置支持的機(jī)型。但在 Xcode12 中, Valid Architectures 這一項(xiàng)被移除掉了,改變成了 VALID_ARCHS 的欄目。但是升級 Xcode12 以后的版本,工程配置是這樣的 EXCLUDED_ARCHS,表示配置不包含的 CPU 架構(gòu),在這里就可以把不需要或者一些三方框架不支持的架構(gòu)配置在這里。如果 Excluded architectures 里配置了架構(gòu),就會去掉配置里的架構(gòu),比如配置了armv7 ,那么真機(jī)里就只有 arm64 了。 -
Build Active Architecture Only:
指定是否只對當(dāng)前連接設(shè)備所支持的指令集編譯,當(dāng)其值設(shè)置為 Yes,是為了debug 的時候編譯速度更快,它只編譯當(dāng)前的 Architecture 版本,而設(shè)置為 No 時,會編譯所有的版本。 所以,一般 debug 的時候可以選擇設(shè)置為 Yes,release 的時候要改為 No,以適應(yīng)不同設(shè)備。

浙公網(wǎng)安備 33010602011771號