处理器架构和配置
成功之前我们要做应该做的事情,成功之后我们才可以做喜欢做的事情。
1. 处理器架构
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 的体系结构有一个指令集加上一些寄存器而组成。
2. 指令集
计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。指令集,就是 CPU 中用来计算和控制计算机系统的一套指令的集合,而每一种新型的 CPU 在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到 CPU 的性能发挥,它也是 CPU 性能体现的一个重要标志。指令的强弱也是 CPU 的重要指标,指令集是提高微处理器效率的最有效的工具之一。
直观的解释指令集主要是指 CPU 硬件和软件之间的接口描述,它本质上是一段二进制机器码,CPU 只能识别机器码,但是机器码是一串无意义的字符串,程序员很难看看懂这些语句,用它来开发软件,所以后面就发明了汇编语言,汇编语言本质上跟机器码一一对应的,现在有很多不同版本的汇编语言,本质上就是有不同的指令集,指令集可以简单的分为复杂指令集和精简指令集。
指令集架构是计算机体系架构的一部分。指令集是一个很虚的东西,是一个标准规范。例如我们的交通规则,红灯停、绿灯行、黄灯亮了等—等,只有行人和司机都去遵守这套交通规则我们的交通系统才能有条不紊地运行下去。指令集也一样,芯片工程师在设计 CPU 时也要以指令集中规定的指令格式为标准实现不同的译码电路来支持指令集各种指令的运行。指令集最终的实现就是微架构,就是CPU 内部的各种译码和执行电路。
编译器厂商在研发编译器工具或 IDE 时,也要以指令集为标准将我们编写的 C 语言高级程序转换为指令集中规定的各种机器指令。为什么我们编写的高级程序经过编译后可以直接在 CPU 上运行呢?就是因为 CPU 设计者和编译器开发者遵循的是同一个指令集标准,“编译器最终编译生成的指令”都是 CPU 硬件电路支持运行的指令,每一种不同架构的 CPU 一般都需要配套一个对应的编译器。
指令集作为 CPU 和编译器的设计规范和参考标准主要用来定义指令的各种操作、操作数的类型、寄存器的分配、地址的格式等。
指令集也不是—成不变的也会随着应用需求的推动不断迭代更新,不断扩充新的指令。例如 ARM 指令集从最初的 ARMv1 发展到目前的 ARMv9,一直在不断地发展不断添加新的指令。
3. 架构和指令集关系?
架构主要是指某一个处理器所使用的具体指令集,比如说 m6ull,他是基于ArmV7 架构的,就是指它是使用 armV7 指令集,在大部分场合,架构等于指令集。
CPU 的硬件结构,即架构,一旦确定,那么使用该架构的 CPU 能实现的功能大体上是一样的,而且去实现该功能的指令集也大体上一样的。
设计 CPU 架构即决定了指令集,如 X86 指令集,是因为该 CPU 采用了 X86 结构,所以才叫 X86 指令集;指令集是指某种架构 CPU 能实现的所有功能,这些功能对应的代码编号构成指令集;代码编号应该就是指机器码这种底层代码,某种架构 CPU 架构确定后,代码编号就确定了,这些编号反映了 CPU 以什么样的方式去执行某些功能,决定了硬件的执行方式;前面说这些代码编号可能就是机器码,机器码就是二进制数字,二进制数字反映在电路上就是高低电平,从而驱动电路运行;不同代码编号的二进制数字排列就不同,所以驱动电路的高低电平就不同,所以电路执行的方式就不同。
同一个程序 -> 汇编语言 -> 不同指令集 -> 不同架构的 CPU -> 不同的实现电路 -> 相同的功能。
4. Apple 处理器和配置
下面对 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|armv7s|arm64 都是 ARM 处理器架构指令集。
- i386|x86_64 是 Mac 处理器的指令集。
这些指令集在那些设备架构中用到?
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,以适应不同设备。