一 、CPU架构

不同的CPU架构通常使用不同的指令集。每种CPU架构都有其自己的一组特定的机器指令,这些指令用于执行计算机程序。不同的CPU架构之间的指令集是不兼容的,这意味着编写的程序通常需要根据目标CPU的架构进行编译或汇编,以确保它们能够在该CPU上正确运行。

一些常见的CPU架构包括:

  1. x86架构:这是一种广泛使用的CPU架构,英特尔和AMD的“专属”,常见于个人计算机。Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号兼容,主要有8086,8088(16位),80186,80286(过渡产品),80386,80486以及以后各种型号的Pentium芯片(32位CPU),通常所说的x86都是指32位CPU

    • i386:其实就是指Intel 80386,是第一个32位的x86架构的处理器,所有intel早期的cpu,amd早期的cpu都支持这种指令集,intel官方文档里面称为“IA-32”(安腾)
    • AMD64:在原始32位X86指令集的基础上加入了X86-64扩展64位X86指令集,使这款芯片在硬件上兼容原来的32位X86软件,并同时支持X86-64的扩展64位计算
    • x86-64:AMD比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64,后来Intel也开始支持AMD64的指令集,但是换了个名字,叫x86_64,表示是x86指令集的64位扩展
  2. ARM架构:ARM是一种低功耗、广泛应用于移动端和便携设备的CPU架构。ARM指令集包括一系列ARM汇编指令,用于执行各种操作,包括数据处理、分支、加载/存储等

  3. MIPS架构:MIPS是一种用于嵌入式系统(网关和机顶盒)和一些服务器领域的CPU架构,其指令集包括一组MIPS汇编指令,用于执行各种任务。

在不严格要求的情况下:

  • x86=i386=IA32
  • amd64=x86_64=x64!=IA64(纯64架构,不兼容32位,被市场抛弃)

AMD 和 Intel 在它们的CPU中实现了一些不同的指令集扩展。这些扩展通常是为了提供更好的性能、安全性或能力。一些著名的扩展包括:

  1. SSE (Streaming SIMD Extensions):基于x86体系架构的实现,用于加速多媒体数据处理,如图像处理和音频处理
  2. AVX (Advanced Vector Extensions):基于x86体系结构的实现。它是由Intel首次引入的,用于加速向量化计算
  3. AES-NI (Advanced Encryption Standard New Instructions):基于x86和x86-64体系结构的指令集扩展,旨在提高加密和解密操作的性能
  4. AMD64 和 Intel 64:虽然它们都是基于x86的64位扩展,但AMD和Intel的64位实现在某些方面略有不同,尽管它们兼容
  5. 虚拟化指令集

厂商开发兼容某种指令集的CPU需要指令集专利持有者授权,典型的例如:Intel授权AMD,使后者可开发兼容x86指令集的CPU。

如果从最基本的逻辑角度来对指令集进行分类的话,可以分为两大类,即所谓的“复杂指令集CISC”与“精简指令集RISC”系统,x86是CISC。

二、操作系统和CPU

不同的CPU有不同的指令集,所以同一个操作系统在不同CPU上运行的是不同的“代码”。

那么,同一个操作系统为不同cpu要写好几遍,也太繁琐了吧。是的,在高级编程语言发明前确实是这样的。但是当高级编程语言(特别是C语言)发明后,操作系统的大部份都是用高级编程语言写的。对于不同的CPU指令集,人们只需要选用相应的编译器(高程程序语言到相应CPU指令集的翻译程序),编译一下就好了。

三、CPU的位数和字长

要设计处理器,首先就需要有指令集,规定处理器相应操作,通过指令集去控制处理器实现相应功能,比如说输入11111111时CPU就会去怎么操作(汇编其实就是用助记符来表示指令集的某一机器指令)。

软件(包括操作系统)之所以会有x86和x64的区分,是因为它们需要与特定的处理器架构兼容。不同的处理器架构具有不同的指令集和寄存器大小,因此软件必须根据目标处理器的架构进行编译和优化。由于x86和x64处理器的寄存器大小和内存访问方式等方面存在差异,编译器需要根据目标架构的特性进行优化和调整。因此,相同的代码在编译为x86和x64时,生成的机器码会有所不同。在程序进行编译的时候会去选择目标平台的位数、操作系统和处理器架构等,如果软件是针对x86指令集编译的,它将只能在x86的CPU上运行,而无法在x64的CPU上运行。

x86和x64使用的是同一套指令集,即x86指令集。x64是x86指令集的64位扩展,但它仍然兼容32位的x86指令集。这意味着x64处理器可以运行32位的操作系统和应用程序,同时也能够运行64位的操作系统和应用程序。

CPU位数(机器字长)= CPU中寄存器的位数

地址总线的位数决定了CPU的寻址能力,它不一定和CPU位数相同,比如早期16位的CPU使用的是20位的地址总线,通过段地址的方式来实现20位的寻址。而现在64位的CPU一般用的也就是40位的地址总线,因为没有那么大的地址寻址的需求。而如果数据总线的长度小于字长的话,那么会浪费cpu的处理能力,大于字长的话,传动过来的数据cpu一次处理不完,所以一般数据总线的长度等于字长。

操作系统也有位数,操作系统的位数是依赖于指令集架构的,比如操作系统可能会写着"64位操作系统,基于x64的处理器"。它是假定操作系统就是工作在x64的处理器上,操作系统里会去用到64位的寄存器,这也意味着CPU的位数至少是64,当然也可以更大,比如32位操作系统是可以工作在64位的CPU上的。