本篇博文是解决在软件开发、软件交付实施过程中,常常需要找寻与服务器硬件CPU架构适配的软件包时,开发或实施工程师时常摸不着头脑。 本文将简单介绍CPU指令集、CPU架构、CPU处理器/芯片、Soc(芯片上的系统)、x86_64架构、arm架构等底层知识模块。
那么,先从CPU架构所涉及的相关概念说起~
1、CPU := 中央处理器
Central Processing Unit,中央处理器。
CPU是计算机系统的核心和大脑,主要由控制器
、运算器
、存储器
和连接总线
构成。
其中,控制器和运算器组成CPU的内核,【内核】从存储器中提取数据,根据控制器中的指令集将数据解码,通过运算器中的微架构(电路)进行运算得到结果,以某种格式将执行结果写入存储器。
因此,内核的基础就是【指令集(指令集架构)】和【微架构】。
处理器是在【指令】的控制下工作的,处理器可以识别的每一条【指令】称为【机器指令】。 计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。 在计算机中,指示计算机硬件执行某种运算、处理功能的命令称为指令。 指令是计算机运行的最小的功能单位,而硬件的作用是完成每条指令规定的功能。
2、CPU 指令集架构 / 微架构
指令集架构( Instruction Set Architecture ),又称指令集或指令系统,是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集,寄存器,寻址模式,存储体系,中断,异常处理以及外部 I/O 。 指令集架构包含一系列的 opcode 即操作码(机器语言),以及由特定处理器执行的基本命令。 简单来说,指令集一般被整合在操作系统内核最底层的硬件抽象层中,属于计算机中硬件与软件的接口,它向操作系统定义了CPU的基本功能。
微架构:ISA在处理器中的实现,被称为Microarchitecture(微架构)。相同的指令集可以有不同的微架构,如Intel 和AMD都是基于X86指令集但微架构不同。
3、指令集架构分类 RISC / CISC
总分类: RISC
VS CISC
(判断依据:指令系统是否精简)
在计算机处理器设计中,RISC(精简指令集计算机)和CISC(复杂指令集计算机)是两种主要的指令集架构。
什么是RISC? RISC,全称为精简指令集计算机(Reduced Instruction Set Computer),是一种采用简化指令集设计的计算机架构。RISC的设计理念是在硬件中实现较少的指令集,从而简化处理器的设计和提高执行效率。RISC架构的主要特点包括:
- 简化的指令集:RISC处理器的指令集相对简单,每条指令执行时间固定,通常在一个时钟周期内完成。
- 较少的寻址模式:RISC架构通常只支持几种简单的寻址模式,这使得指令解码和执行更加高效。
- 大量寄存器:RISC处理器通常拥有较多的寄存器,以减少对内存的访问频率,从而提高性能。
- 硬件实现的流水线:RISC架构通过硬件实现指令流水线,使得多个指令可以同时进行处理,从而提高指令的执行速度。
RISC的优势
- 高效率:由于指令集简单且执行时间固定,RISC处理器可以实现高效的指令流水线,提高指令执行速度。
- 低功耗:RISC架构简化了处理器的设计,减少了功耗,因此广泛应用于移动设备和嵌入式系统中。
- 易于优化:由于指令集和寻址模式较少,编译器可以更容易地优化代码,提高程序的执行效率。
什么是CISC? CISC,全称为复杂指令集计算机(Complex Instruction Set Computer),是一种采用复杂指令集设计的计算机架构。CISC的设计理念是通过在硬件中实现复杂的指令集,从而简化编译器和软件的设计。CISC架构的主要特点包括:
- 复杂的指令集:CISC处理器的指令集非常丰富,可以在一条指令中完成多个操作。
- 多种寻址模式:CISC架构支持多种复杂的寻址模式,使得编写高级语言的编译器更加方便。
- 微代码实现:CISC处理器通常通过微代码实现复杂指令,这使得处理器可以支持更多的指令类型。
- 指令长度不固定:CISC指令的长度不固定,这使得指令的解码和执行更加复杂,但也更灵活。
CISC的优势
- 指令功能强大:CISC处理器的指令集功能强大,可以直接执行复杂操作,减少了程序的指令数量。
- 向后兼容性好:由于CISC处理器支持丰富的指令集,能够运行大量历史遗留的软件和应用程序。
- 灵活性高:CISC处理器的复杂指令集和多种寻址模式使其具有很高的灵活性,适用于各种应用场景。
对比项 | CISC | RISC |
---|---|---|
目的 | 增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化 | 减少指令种类和简化指令功能,提高指令的执行速度 |
指令系统 | 复杂、庞大 | 简单、精简 |
指令数目 | 一般大于200条 | 一般小于100条 |
指令字长 | 不固定 | 固定 |
可访存指令 | 不加限制 | 只有LOAD/STORE指令 |
各指令的执行时长 | 指令间执行时长差距很大 | 绝大多数在1个周期内完成 |
各种指令的使用频度 | 指令间频度差距很大 | 指令都比较常用 |
通用寄存器数量 | 较少 | 多 |
中断 | 机器是在一条指令执行结束后响应中断 | 机器在一条指令执行的适当地方可响应中断 |
单元电路(功耗) | 包含有丰富的电路单元,因而功能强、面积大、功耗大 | 包含有较少的单元电路,因而面积小、功耗低 |
目标代码的执行效率 | 难以用优化编译生成高效的目标代码程序 | 采用优化的编译程序,生成代码相对较为高效 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |
微处理器的设计周期 | 微处理器结构复杂,设计周期长 | 微处理器结构简单,布局紧凑,设计周期短,且易于采用最新技术 |
适用场景 | 适用于【通用型机器】;功能强大,易于/利于实现、处理特殊功能,因有专用指令来完成特定功能 | 适用于【专用型机器】,因RISC指令系统的确定与特定的应用领域有关;指令规整,性能容易把握,易学易用 |
被应用的指令集(架构) | X86指令集(架构) | MIPS、ARM、RISC-V、Power-PC[IBM]、SPARC、AArch64(基于ARMv8架构的、分离出来的64位的执行状态)指令集(架构) |
总结 RISC和CISC架构各有其优缺点,适用于不同的应用场景。RISC架构以其高效、低功耗的特点,在移动设备和嵌入式系统中得到了广泛应用。而CISC架构则以其强大的指令功能和向后兼容性,在高性能计算和服务器领域占据了重要地位。
4、CISC 指令集
指令集架构 | 发源于(时间、干系人) | 具体示例 | 拓展、延申出来的架构 | 微处理器 | 是否开源 |
---|---|---|---|---|---|
X86指令集(架构) | 创始者:Intel公司 | X86-32/X86-64(即AMD64/Intel64) | (略) | Intel i8086 CPU处理器(首台X86 CPU) VIA CPU处理器 Intel Core I3/I5/I7/I9 CPU处理器 AMD CPU处理器 | 商业闭源 |
5、RISC 指令集
指令集架构 | 发源于(时间、干系人) | 特点 | 具体示例 | 拓展、延申出来的架构 | 微处理器 | 是否开源 | 备注 |
---|---|---|---|---|---|---|---|
MIPS(Million Instructions Per Second)指令集架构 | 1.创立于1998年; 2.创始者:斯坦福大学教授John LeRoy Hennessy(RISC架构的开拓者) |
1.在1999年前被适用最多; 2.更成熟; |
MIPS I/II/III/IV/V/16/32/64 | (略) | 龙芯芯片 | 商业闭源 | 1.MIPS本来就没有一个较为统一的生态。因MIPS被转卖多次、很多相关专利已经被卖掉了(导致当前母公司Wave Computing所掌握的专利本就有限)、碎片化问题非常严重 |
ARM(Acorn/Advanced RISC Machine)指令集架构 | 1.创立于1985年; 2.创始者:Acorn公司、加州大学伯克利分校Sophie Wilson和Steve Furber |
1.低功耗、低成本; 2.ARM家族占比全世界32位嵌入式处理器的75%。 |
ARMv7a架构:ARM Cortex A8/A9 ARMv8架构(支持32+64位架构):ARM Cortex A32/35/53/57/72/73/77/78 |
Apple Swift、Marvell的XScale、德州仪器的OMAP系列 | 高通骁龙、海思麒麟、三星Exynos、Apple A系列处理器 | 商业闭源(IP授权模式) | 1.ARM公司的商业模式:IP授权模式; 2.主要业务范围:ARM指令集、ARM微架构、ARM芯片(不自己造) |
AArch64/ARM64(ARMv8A架构的64位指令集架构) | 1.概念于2011年在美国加州圣克拉拉的一场技术大会发布 | 1.保留了TrustZone、虚拟化、NEON等关键技术特性; 2.完全向下兼容32位ARM架构。 |
... | ... | ... | (同上) | aarch64的Apple后端称为arm64,而LLVM社区开发的后端称为aarch64。 |
AArch32指令集(ARMv8A架构的32位指令集架构) | (同上) | (同上) | (同上) | (同上) | (同上) | (同上) | (暂无) |
Power PC(Performance Computing)指令集 | 1.POWER是1991年,Apple、IBM、Motorola组成的AIM联盟发展出的微处理器架构; 2.但是自2005年起,苹果电脑将旗下产品转用Intel CPU。 |
1.强嵌入式表现:高性能、能耗损失低、散热低; 2.主要应用领域:高端服务器、嵌入式设备。 |
(略) | (略) | 任天堂Gamecube、MPC系列 | 现已开源 | 1.所有PowerPC(包括64位实现)都使用定长的32位指令。 |
SPARC(可伸缩的处理器架构)指令集 | 1987年,SUN公司与TI合作的成果 | 1.主要应用于星载计算机、嵌入式设备。 | (略) | (略) | ERC 32(欧洲航天航空局) | 开源 | (略) |
RISC-V/RISC-FIVE指令集(Reduced Instruction Set Computer-V) | 1.创始者:Keste Asanovic、David Pattern、Andrew Waterman、Yunsup Lee; 2.源于2010年在加州大学伯克利分校的研究项目。 |
1.生态联盟强大; 2.开源+免费,采用BSD许可证。 |
(略) | (略) | (略) | 开源(BSD协议) | 相对X86的复杂度,RISC-V的指令集手册相对简洁。 |
6、国产芯片公司
处理器领域的两大巨头仍然是Intel 和 AMD 公司。
国产芯片种类繁多, 基于 ARM 架构 授权的芯片厂商最有可能形成自主可控指令集。 由于指令集的复杂性和重要性,自主研发一套全新的指令集难度较大且效益不高。国产CPU厂家大多选择购买国外授权,以实现不同程度的自主可控。目前, 国产CPU架构大体可以分为三类:
-
第一类,是以龙芯为代表的MIPS 指令集架构和以申威为代表的 Alpha 架构,申威已基本实现完全自主可控(申威64已经完全形成了自己的架构),龙芯部分关键技术需付专利费。
-
第二类,是以飞腾和华为鲲鹏为代表基于 ARM 指令集授权的国产芯片。ARM主要有三种授权等级:使用层级授权、内核层级授权和架构指令集层级授权,其中指令集层级授权等级最高,企业可以对ARM 指令集进行改造以实现自行设计处理器,如苹果在 ARM v7 架构基础上开发出苹果 Swift 架构, 其他如:高通、Krait 、Marvell等都是基于ARM指令集或微架构进行的改造。因此,已经获得ARM V8 永久授权的海思、飞腾等厂家凭借自身的研发能力,亦有可能发展出一套自己的指令集架构。
-
第三类,是以海光、兆芯为代表的获得X86的授权(仅内核层级的授权),未来扩充指令集形成自主可控指令集难度较大。因此, 可以看出,在自主可控程度上申威、龙芯、飞腾、鲲鹏较高。 未来鲲鹏和飞腾如果基于 ARM V8 发展出自己的指令集, 则创新可信程度将显著提升。
7、 程序语言代际 | 编译型程序语言 / 解释型程序语言
计算机程序语言的发展代际: 3代。
- ①第1代: 机器语言 (二进制的机器代码/指令集集合) [20世纪中期]
- ②第2代: 汇编语言/符号语言 (用类人类语言描述指令集,即非指令集, x86汇编 /8086汇编 /AT&T汇编 /Intel汇编 /ARM汇编) [20世纪50年代-60年代]
- ③第3代: 高级语言 (人类化的程序语言, C++/Java/Python/C#/JavaScript等)
CPU执行计算任务时都需要遵从一定的规范/语言,程序(可执行的、二进制机器语言)在被执行前都需要先翻译为CPU可理解的语言。 这种规范或语言就是【指令集】(ISA,Instruction Set Architecture)。 程序(二进制执行程序)被按照某种指令集的规范翻译为CPU可识别的底层二进制代码的过程叫做【编译】(Compile)
编译的一般过程:
源程序分析
词法分析
语法分析
语法检查
中间代码生成
代码优化
目标代码生成
8、Linux系统信息的查询命令
uname -a # 查看内核/操作系统/CPU信息
head -n 1 /etc/issue # 查看操作系统版本
cat /proc/cpuinfo # 查看CPU信息
hostname # 查看计算机名
lspci -tv # 列出所有PCI设备
lsusb -tv # 列出所有USB设备
lsmod # 列出加载的内核模块
env # 查看环境变量资源
free -m # 查看内存使用量和交换区使用量
df -h # 查看各分区使用情况
du -sh <目录名> # 查看指定目录的大小
grep MemTotal /proc/meminfo # 查看内存总量
grep MemFree /proc/meminfo # 查看空闲内存量
uptime # 查看系统运行时间、用户数、负载
cat /proc/loadavg # 查看系统负载磁盘和分区
mount | column -t # 查看挂接的分区状态
fdisk -l # 查看所有分区
swapon -s # 查看所有交换分区
hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
dmesg | grep IDE # 查看启动时IDE设备检测状况网络
ifconfig # 查看所有网络接口的属性
iptables -L # 查看防火墙设置
route -n # 查看路由表
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息进程
ps -ef # 查看所有进程
top # 实时显示进程状态用户
w # 查看活动用户
id <用户名> # 查看指定用户信息
last # 查看用户登录日志
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务服务
chkconfig –list # 列出所有系统服务
chkconfig –list | grep on # 列出所有启动的系统服务程序
rpm -qa # 查看所有安装的软件包