6

CPU 指令集不靠谱扫盲

 2 years ago
source link: https://idealclover.top/archives/592/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

CPU 指令集不靠谱扫盲

2019.12.03 | 零零碎碎 | 4292 浏览 | 7 赞 | 8 条评论


请注意,本文编写于 719 天前,最后修改于 719 天前,其中某些信息可能已经过时。

这两天在酷安上偶然刷到,毒瘤微信终于支持 64 位版本安卓系统了,架构改为了 arm64-v8a

正巧整理笔记整理到 CPU 架构之类的一块。说起来这些东西在大一的大计基有讲过,但毕竟教科书 emmm 挺落后时代的,而且自己当时也没有怎么认真听 XD;而自己在网上冲浪的时候老哥们又往往假定我们已经知道这些东西了,说的话让人云里雾里。于是打算整理整理相关的东西,写在这里。如果有其他入坑的小伙伴同样感到困惑,也是可以用来扫盲的。

(感觉很久没有写这么硬核的东西了... 毕竟不是计算机专业,如有疏忽烦请提醒,求轻喷 QAQ

“指令集” 是干嘛的

指令集就是指令的集合。

计算机生下来就是为了操作各种各样的指令的,而都有哪些指令的形式,要怎么去操作,也就构成了指令集。

比方说把某位置上的数据移动到另一位置,把某些位置上的数据相加。正是这些看起来很基础的指令,才一步步堆叠而成了今天我们所看到的复杂软件。

市面上有哪些指令集

从指令集按照复杂程度,分为复杂指令集 CISC(Complex Instruction Set Computing)与精简指令集 RISC(Reduced Instruction Set Computing)

顾名思义,复杂指令集有很多很复杂的指令,而精简指令集只有一些基本的指令,复杂的指令都需要通过这些简单指令的组合完成。

以洗衣机洗衣服为例,精简指令集的操作为,加水 -> 漂洗 -> 风干;而复杂指令集会有一个 “洗衣” 的指令,从而让洗衣机自动帮忙做这一整套的流程。

CISC 可以通过一条复杂的指令来完成许多事情,性能在处理复杂的任务时,会比 RISC 更为高效;但随之而来的是面积和功耗的提升。

复杂指令集的代表是 X86 架构,代表生产商为 intel 和 AMD;而精简指令集的代表则是 ARM,代表厂商为高通,三星,联发科,华为等等(除 intel 和 AMD 外的几乎所有厂商)。

顺便一提,这也是为什么前一段时间华为禁令沸沸扬扬的时候,对华为影响最大的其实是 ARM 的拟停止授权 —— 如果 ARM 喊停的话,意味着华为的芯片将被迫更改指令集,使得其无法运行现在市面上绝大多数的程序。

同样的,正是两种指令集的不同特性决定了他们的不同应用 ——intel 的芯片更多用在电脑,服务器等计算与功耗场合,而 ARM 的芯片则更多应用在嵌入式,手机等小型应用的场合 —— 要不发热一高手机该怎么办~

进一步的,这两种指令集背后代表的也是封闭式 - 授权式两种不同的商业模式。

对于 X86 阵营来说,Intel 与 AMD 的创始人当年都是由 Fairchild 半导体出走。而一直被 Intel 死死握着的技术专利,也由于 IBM 强烈要求下需要授权给第二供应商 —— 而 AMD 也就成为了这个 “第二供应商”,在与 Intel 调解后获得了其技术专利使用权,由此成为 X86 中的又一员。

对于 ARM 来讲则使用了另一种商业模式,“ARM 就是个给图纸的他懂个 p 的芯片”.jpg。ARM 自己不制造芯片,只将芯片的设计方案授权(licensing)给其他公司,由它们来生产,这也就使得市面上除 Intel 与 AMD 两家外几乎所有的微处理器生产商使用的都是 ARM 指令集。

简而言之是这样的

- 复杂指令集 CISC 精简指令集 RISC 指令形式指令多,复杂指令少,简单代表厂商 Intel AMDARM (生产商:高通 / 华为 / 三星 / 联发科)功耗高低功能强弱商业模式制作 & 生产委托授权

当然,事实上随着事情的发展,CISC 和 RISC 各自都吸取了各自的长处,简单的简单 / 复杂已经无法很好地区分二者了,AMD 也开始向计算机方向渗透,而 Intel 也在降低其功耗。这里只是一个较为粗浅的划分。

32 位和 64 位又是什么

众所周知 个锤子,电脑内部所干的事只有一个:找到指定位置的数据,做指定形式的操作。而所说的 “指定位置”,则需要对每一个位置以一个唯一的 “标识”,才能知道是 “那个位置” 的数据,也就是 “地址”—— 而这个地址用 32 个二进制位表示,还是用 64 个二进制位表示,也就形成了 32 位和 64 位的区别。

32 位地址也就是 2^32=4GB,于是理论上 32 位的 CPU 最多可以操作 4GB 的内存;其实是当初设计计算机的人并没有想到有一天计算机会用到这么大的内存(4GB+),所以设计不足,没得办法才后期扩充到 64 位(ipv4 地址又何尝不是呢 叹气)

对于 Intel 系,1978 年 intel 最先推出了 x86-32 架构,我们今天一般简称为 x86,之后 AMD 也兼容了该架构并推出了其自己的处理器;而 64 位中,则是 AMD 首先基于 X86 推出了其 64 位拓展形式,并命名为 AMD64,之后英特尔推出了与之兼容的处理器架构,命名为 Intel 64,二者一般今天被统称为 X86-64 或 X64。

其实 Intel 也提出过 64 位架构,不过不和其原本的 32 位架构相兼容,只能用于其自家的安腾系列处理器上(IA-64),于是也就成了个笑话,最终 Intel 还是得用 AMD 的 64 位方案。

而对于 ARM 系,则是 ARM 在 V7 架构的基础上提出了与之相兼容的 64 位 V8 架构,相对平滑地过度到了 64 位方案。

但是,要想成功运行 64 位程序,则需要软件,操作系统与 CPU 的通力合作才可以。三者需要都支持 64 位,才可以使得 64 位真正被达到。少了任何一环,程序都只能用 32 位进行兼容运行(或者无法运行)。即:如果软件只支持 32 位,即使跑在 64 位的系统上,最多也只能使用 4GB 内存。

硬件支持了,操作系统和软件也要跟上。早在 14 年的 Android L 版本中, Google 就加入了 64 位的支持。而对于迟迟不肯悔改的 Google Play 商店上的毒瘤 32 位应用,play 商店也下达了 19 年 8 月 1 日的最终通牒,使得现在 play 商店上的应用必须支持 64 位架构。(也许这就是微信开始支持 64 位的原因了 // 摊手

苹果更不用说了... 人家在 5S 的时候就已经支持了...

简单做个总结

-32 位 64 位 IntelX86 (X86-32)X86-64 (X64/AMD64),IA-64ARMARM-v7ARM-V8

安卓开发的架构问题

因为自己之前做安卓应用,在打包的过程中也正巧遇到了些关于 CPU 架构的问题。

具体来说,不同的安卓设备由于使用不同的 CPU,所以也就拥有不同的二进制应用程序接口(ABI),在打包的时候也就会有不同的包。

  • armeabi:通用性强,但速度慢。如果项目只包含了 armeabi,那么在所有 Android 设备都可以运行;
  • armeabi-v7a:如果项目只包含了 armeabi-v7a,除 armeabi 架构的设备外都可以运行;
  • arme64-v8a:支持 64 位版本的设备,使得其可以使用 64 位进行处理;
  • x86:一般用于虚拟机上进行运行,如果项目只包含了 x86,那么 armeabi 架构和 armeabi-v7a 的 Android 设备是无法运行的;

而一般我们为了包的泛用性,往往会同时包含 armeabi, armeabi-v7a 和 x86,使得其在所有设备都可以运行,程序在运行的时候去加载不同平台对应的 so,这是较为完美的一种解决方案,但同时也会导致包变大。

其实我觉得微信改 64 位没啥用... 更多可能只是为了适应谷歌商店的新规定, 而且微信以后可能更变本加厉了...

看着恐怖的安装包和内存占用(叹气

为什么会有人喜欢用微信呢(

好久不写这种东西了... 以后会尽量讲得通俗点的...

有意见和建议欢迎提(捂脸 有错误也请指正 QAQ 毕竟傻翠

本文链接:https://idealclover.top/archives/592/

本作品由 idealclover 采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 进行许可,转载请注明出处。

标签: 微信 , 服务器 , 链接 , 平台 , emmm, 技术 , 安装 , 手机 , 指令 , arm, 架构 , intel, amd


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK