成功之前我們要做應該做的事情,成功之後我們才可以做喜歡做的事情。
CPU 架構是 CPU 廠商給屬於同一系列的 CPU 產品定的一個規範,主要目的是為了區分不同型別 CPU 的重要標示。市面上的 CPU 分類主要分有兩大陣營,一個是 intel、AMD 為首的 複雜指令集 CPU,另一個是以 IBM、ARM 為首的 精簡指令集 CPU。兩個不同品牌的 CPU,其產品的架構也不相同,例如,Intel、AMD 的 CPU 是 X86架構 的,而 IBM 公司的 CPU是 PowerPC 架構,ARM 公司是 ARM 架構。
從 CPU 發明到現在,有非常多種架構,從我們熟悉的 X86、ARM,到不太熟悉的MIPS、IA64,它們之間的差距都非常大。但是如果從最基本的邏輯角度來分類的話,它們可以被分為兩大類,即所謂的「複雜指令集」與「精簡指令集」系統,也就是經常看到的「CISC」與「RISC」。
中央處理單元(CPU)主要由運算器、控制器、暫存器三部分組成,從字面意思看運算器就是起著運算的作用,控制器就是負責發出 CPU 每條指令所需要的資訊,暫存器就是儲存運算或者指令的一些臨時檔案,這樣可以保證更高的速度。CPU 有著處理指令、執行操作、控制時間、處理資料四大作用,打個比喻來說,CPU 就像我們的大腦,幫我們完成各種各樣的生理活動。因此如果沒有 CPU,那麼電腦就是一堆廢物,無法運作。移動裝置其實很複雜,這些 CPU 需要執行數以百萬計的指示,才能使它向我們期待的方向執行,而 CPU 的速度和功率效率是至關重要的。速度影響使用者體驗,而效率影響電池壽命。最完美的移動裝置是高效能和低功耗相結合。
在計算世界中,「體系結構」一詞被用來描述一個抽象的機器,而不是一個具體的機器實現。一般而言,一個 CPU 的體系結構有一個指令集加上一些暫存器而組成。
計算機指令就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是計算機的工作過程。指令集,就是 CPU 中用來計算和控制計算機系統的一套指令的集合,而每一種新型的 CPU 在設計時就規定了一系列與其他硬體電路相配合的指令系統。而指令集的先進與否,也關係到 CPU 的效能發揮,它也是 CPU 效能體現的一個重要標誌。指令的強弱也是 CPU 的重要指標,指令集是提高微處理器效率的最有效的工具之一。
直觀的解釋指令集主要是指 CPU 硬體和軟體之間的介面描述,它本質上是一段二進位制機器碼,CPU 只能識別機器碼,但是機器碼是一串無意義的字串,程式設計師很難看看懂這些語句,用它來開發軟體,所以後面就發明了組合語言,組合語言本質上跟機器碼一一對應的,現在有很多不同版本的組合語言,本質上就是有不同的指令集,指令集可以簡單的分為複雜指令集和精簡指令集。
指令集架構是計算機體系架構的一部分。指令集是一個很虛的東西,是一個標準規範。例如我們的交通規則,紅燈停、綠燈行、黃燈亮了等—等,只有行人和司機都去遵守這套交通規則我們的交通系統才能有條不紊地執行下去。指令集也一樣,晶片工程師在設計 CPU 時也要以指令集中規定的指令格式為標準實現不同的譯碼電路來支援指令集各種指令的執行。指令集最終的實現就是微架構,就是CPU 內部的各種譯碼和執行電路。
編譯器廠商在研發編譯器工具或 IDE 時,也要以指令集為標準將我們編寫的 C 語言高階程式轉換為指令集中規定的各種機器指令。為什麼我們編寫的高階程式經過編譯後可以直接在 CPU 上執行呢?就是因為 CPU 設計者和編譯器開發者遵循的是同一個指令集標準,「編譯器最終編譯生成的指令」都是 CPU 硬體電路支援執行的指令,每一種不同架構的 CPU 一般都需要配套一個對應的編譯器。
指令集作為 CPU 和編譯器的設計規範和參考標準主要用來定義指令的各種操作、運算元的型別、暫存器的分配、地址的格式等。
指令集也不是—成不變的也會隨著應用需求的推動不斷迭代更新,不斷擴充新的指令。例如 ARM 指令集從最初的 ARMv1 發展到目前的 ARMv9,一直在不斷地發展不斷新增新的指令。
架構主要是指某一個處理器所使用的具體指令集,比如說 m6ull,他是基於ArmV7 架構的,就是指它是使用 armV7 指令集,在大部分場合,架構等於指令集。
CPU 的硬體結構,即架構,一旦確定,那麼使用該架構的 CPU 能實現的功能大體上是一樣的,而且去實現該功能的指令集也大體上一樣的。
設計 CPU 架構即決定了指令集,如 X86 指令集,是因為該 CPU 採用了 X86 結構,所以才叫 X86 指令集;指令集是指某種架構 CPU 能實現的所有功能,這些功能對應的程式碼編號構成指令集;程式碼編號應該就是指機器碼這種底層程式碼,某種架構 CPU 架構確定後,程式碼編號就確定了,這些編號反映了 CPU 以什麼樣的方式去執行某些功能,決定了硬體的執行方式;前面說這些程式碼編號可能就是機器碼,機器碼就是二進位制數位,二進位制數位反映在電路上就是高低電平,從而驅動電路執行;不同程式碼編號的二進位制數位排列就不同,所以驅動電路的高低電平就不同,所以電路執行的方式就不同。
同一個程式 -> 組合語言 -> 不同指令集 -> 不同架構的 CPU -> 不同的實現電路 -> 相同的功能。
下面對 Apple 處理器做一個格式總結,具體的發展歷程請手動 BD...
處理器/晶片 | 架構、指令集 | 搭載機型 | 釋出時間 |
---|---|---|---|
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 架構設定:
處理器架構、指令集:
這些指令集在那些裝置架構中用到?
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 處理器的指令集:真機 32 位處理器需要 armv7,或者 armv7s 架構指令集、真機64位元處理器需要 arm64/arm64e 架構的指令集。
對於模擬器 x86 32 位處理器測試需要 Intel i386 架構指令集,模擬器 64 位處理器測試需要 Intel x86_64 架構的指令集。
i386 是針對 intel 通用微處理器 x86 架構的 32 位處理器
x86_64 是針對 x86 架構的 64 位處理器
i386|x86_64 應用在 Mac 處理器的指令集
最新 M1、M2 處理器則採用的也是基於 ARM 架構的指令集
在實際開發中的設定問題,Xcode 中指令集相關選項(Build Setting 中):
Architectures:
指定工程被編譯成可支援哪些指令集型別,而支援的指令集越多,就會編譯出包含多個指令集程式碼的封包,對應生成二進位制包就越大,也就是 ipa 包會變大。
一般設定預設值為:Standard Architectures (Apple Silicon, Intel) - $(ARCHS_STANDARD)
,在真機的編譯下實質是(armv7和arm64)、在模擬器的時候是(x86_64、i386)。
Valid Architectures:
限制可能被支援的指令集的範圍,也就是 Xcode 編譯出來的二進位制包型別最終從這些型別產生,而編譯出哪種指令集的包,將由 Architectures 與 Valid Architectures(因此這個不能為空)的交集來確定。Xcode 12 以前,我們通過 Valid Architectures 來設定支援的機型。但在 Xcode12 中, Valid Architectures 這一項被移除掉了,改變成了 VALID_ARCHS 的欄目。但是升級 Xcode12 以後的版本,工程設定是這樣的 EXCLUDED_ARCHS,表示設定不包含的 CPU 架構,在這裡就可以把不需要或者一些三方框架不支援的架構設定在這裡。如果 Excluded architectures 裡設定了架構,就會去掉設定裡的架構,比如設定了armv7 ,那麼真機裡就只有 arm64 了。
Build Active Architecture Only:
指定是否只對當前連線裝置所支援的指令集編譯,當其值設定為 Yes,是為了debug 的時候編譯速度更快,它只編譯當前的 Architecture 版本,而設定為 No 時,會編譯所有的版本。 所以,一般 debug 的時候可以選擇設定為 Yes,release 的時候要改為 No,以適應不同裝置。