CPU(Central Processing Unit,中央处理器)是计算机系统中的主要组件之一,负责执行程序指令并进行数据处理。我们之前已经介绍了CPU与冯诺依曼机CPU与冯诺依曼机-CSDN博客,而ISA(Instruction Set Architecture,指令集架构)则是 CPU 的设计蓝图,定义了 CPU 支持的指令集合、寄存器、数据类型和操作。
ISA
ISA 可以被看作是一种抽象的计算机模型,它规定了计算机硬件与软件之间的接口,使得编译器、汇编器和操作系统能够与 CPU 进行通信,并为程序员提供编程的接口。
ISA 定义了以下内容:
-
指令集:ISA 规定了 CPU 支持的指令集合,包括算术运算、逻辑运算、数据传输、控制流程等操作。不同的 CPU 可能支持不同的指令集,例如 x86、ARM、MIPS 等。
-
寄存器:ISA 规定了 CPU 中的寄存器结构,包括通用寄存器、特殊目的寄存器等。寄存器用于存储指令执行过程中的临时数据、地址和控制信息。
-
内存访问:ISA 规定了 CPU 如何与内存进行交互,包括内存地址空间的组织、地址访问方式(直接寻址、间接寻址等)、数据的读写操作等。
-
数据类型:ISA 规定了 CPU 支持的数据类型和操作,包括整数、浮点数、字符、向量等数据类型,以及对应的算术运算、逻辑运算、转换操作等。
-
异常处理和控制流:ISA 规定了 CPU 如何处理异常事件(如中断、陷阱、系统调用等)、程序的控制流程(分支、跳转、子程序调用等)以及指令执行的顺序和优先级。
总的来说,ISA 定义了 CPU 的体系结构和指令集,为软件开发提供了底层的硬件支持和抽象接口,使得不同的软件可以在不同的 CPU 上运行,并为 CPU 的设计和优化提供了基础。
不同的 ISA(指令集架构)代表着不同类型的 CPU 架构和指令集设计。以下是几种常见的 ISA 的简要介绍:
-
x86:
- x86 是一种由英特尔(Intel)开发的指令集架构,最初用于 16 位和 32 位的微处理器,后来也用于 64 位的处理器。它是个人计算机(PC)和服务器领域最常见的 CPU 架构之一。
- x86 架构的处理器包括 Intel 的 Pentium、Core 系列以及 AMD 的 Athlon、Ryzen 等。
- x86 指令集包括大量的指令,用于执行各种操作,支持多种数据类型和内存访问模式。
-
ARM:
- ARM 是一种精简指令集(RISC)架构,最初由英国的 Acorn Computers 开发,后来成为一种广泛应用于移动设备、嵌入式系统和消费电子产品的 CPU 架构。
- ARM 架构的处理器包括 ARM Cortex-A 系列(应用处理器)、Cortex-R 系列(实时处理器)和 Cortex-M 系列(微控制器)等。
- ARM 指令集精简而高效,适合低功耗和嵌入式系统,同时也具备一定的可扩展性和性能。
-
MIPS:
- MIPS 是一种精简指令集(RISC)架构,由 MIPS Technologies 公司开发,广泛应用于嵌入式系统、网络设备和工业控制等领域。
- MIPS 架构的处理器包括一系列的 MIPS32 和 MIPS64 处理器,其中 MIPS32 适用于 32 位系统,MIPS64 适用于 64 位系统。
- MIPS 指令集简洁而灵活,具有较高的性能和效率,常被用于需要高性能的嵌入式系统和网络设备。
-
PowerPC:
- PowerPC 是一种精简指令集(RISC)架构,最初由 IBM、苹果公司和摩托罗拉共同开发,后来成为游戏机、工作站和嵌入式系统的常用 CPU 架构之一。
- PowerPC 架构的处理器包括 IBM 的 Power 系列和 Freescale(原 Motorola)的 PowerPC 系列。
- PowerPC 指令集在高性能计算和嵌入式领域表现出色,具有较高的性能、可扩展性和可靠性。
ISA与编译
ISA那么重要,那么我们编译一个java文件或者C文件的过程中,他扮演了什么角色呢?
C语言
-
编译阶段:在编译C程序时,编译器会将源代码转换为目标机器的汇编代码。这个过程中,编译器会根据目标机器的ISA生成相应的汇编代码,以便最终生成与该ISA兼容的机器码。
-
链接阶段:在链接阶段,编译器会将各个源文件编译生成的目标文件链接在一起,形成最终的可执行文件。链接器会处理符号解析、重定位等任务,并确保生成的可执行文件与目标机器的ISA兼容。
C程序在编译和链接阶段会考虑到目标机器的ISA,以生成适合该平台的机器码。
Java
在Java程序中,不同机器的ISA(Instruction Set Architecture)通常在Java虚拟机(JVM)执行字节码时发挥作用。Java字节码是与平台无关的中间代码,它由javac
编译器从Java源代码生成。当Java程序在特定的平台上运行时,Java虚拟机会将字节码转换为该平台的本地机器码执行,这个转换过程中会考虑到该平台的ISA。因此,Java程序在执行过程中会在JVM层面与不同机器的ISA进行交互。
CPU位数
在计算机中,CPU位数通常指的是CPU寄存器的位数,这决定了CPU一次可以处理的数据位数。CPU寄存器是CPU内部用于存储和处理数据的关键部件,因此其位数直接影响着CPU能够处理的数据大小。
举例来说,一个32位CPU意味着它的寄存器的宽度是32位(也交一个word),即一次能处理32位的数据。同样,64位CPU的寄存器宽度是64位,可以一次处理64位的数据。CPU的位数通常也就是它能够寻址的内存地址的位数,及地址总线位数,也等于操作系统的位数。
地址线的位数决定了计算机可以寻址的内存单元的数量。如果一个计算机有 n 位地址线,也就是地址有几个bit位,那么它可以寻址 2^n 个内存单元。例如,32位地址线可以寻址的内存单元数量是 2^32,而64位地址线可以寻址的内存单元数量是 2^64。
有了计算机的内存大小与地址线位数,我们就能计算出常见的计算机内存单元大小了,分别为1,2,4字节。
以一个4GB内存,32位机器为例
这样我们就得到了最为常见的一个内存单元大小。
我们在以C语言为例,先介绍一下,笔者用的是Vs studio,Vs studio提供了两种架构来使用
-
X86 架构:X86 架构是一种 32 位或64位的指令集架构,它最初由 Intel 公司开发,并被广泛应用于个人计算机和服务器领域。X86 架构的处理器可以是 32 位的,也可以是 64 位的。在 32 位的处理器上运行的操作系统通常被称为 X86 操作系统。
-
X64 架构:X64 架构是一种 64 位的指令集架构,也被称为 AMD64 或 Intel 64。它是在 X86 架构的基础上扩展而来的,增加了对更大内存地址空间的支持。X64 架构的处理器只能是 64 位的。在 64 位的处理器上运行的操作系统通常被称为 X64 操作系统或者 64 位操作系统。
我将用地址的大小与bit位位数,来显示是32位机器还是64位机器,一个计算机有 n 位地址线,也就是地址有几个bit位
此时X86这个架构下,我用的是32位,此时地址为8*4=32bit,X64这个架构下我用的是64位,地址大小为8*8=64位。