---
title: "CPU架构相关到操作系统"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/cpu-arch-and-os/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/01-系统基础与网络安全/计算机与操作系统/CPU架构相关到操作系统.md"
content_hash: bc17c3e730b227411e4c65a588422b4141d2681a6358380b951d04d90102cf80
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# CPU架构相关到操作系统

> 创建时间：2020/9/28 17:19

## X86架构

x86泛指一系列英特尔公司用于开发处理器的指令集架构

较早期的处理器名称是以数字来表示80x86（包括Intel 8086、80186、80286、80386以及80486），因此其架构被称为“ **x86** ”。现时英特尔将其称为 **IA-32** ，全名为“Intel Architecture, 32-bit”，一般情形下指代32位的架构。由于数字并不能作为注册商标，因此Intel及其竞争者均在新一代处理器使用可注册的名称，如 **Pentium** ，来描述x86架构下的处理器产品。

8086是16位处理器；直到1985年32位的80386的开发，这个架构都维持是16位。接着一系列的处理器表示了32位架构的细微改进，推出了数种的扩展，直到2003年AMD对于这个架构发展了64位的扩展，并命名为 **AMD64** 。
后来英特尔也推出了与之兼容的处理器，并命名为 **Intel 64** 。

两者一般被统称为 **x86-64(64-bit extended)** 或 **x64** ，开创了x86的64位时代。
x86-64向后兼容于16位及32位的x86架构。

### CPU，指令集与OS的位数

**CPU的位数** 是CPU一次能够并行处理的数据宽度，一般就是指数据总线宽度。也指CPU能一次同时寄存和处理二进制数码的位数，这和CPU中寄存器的位数对应。

**指令集** 和CPU的位数是有联系的。如Intel 8086 CPU 是16位，其指令集也是16位；Intel 80386DX CPU 是32位，其指令集也是32位，但它也保持原16位指令集，这是为了向上兼容。

**操作系统的位数** 操作系统位数 = 其所依赖的指令集位数 <= CPU位数

操作系统位数应该是根据 **指针类型的位数** 来定的。整数类型不一定跟位数相等。

> 计算机字长取决于数据总线的宽度，是指一次能传输的数据的位数，通常就是CPU一次能处理的数据的位数，所以字长就是取决于数据总线。像平时我们买电脑说的64位的处理器，指的就是字长为64的CPU。

### 32 vs 64位

32位CPU只有8个32位通用寄存器
x86_64把这8个通用寄存器扩展成了64位的，并且比x86增加了若干个寄存器

> 对于普通程序来说，CPU位数的扩展、寄存器数量的增加不会带来明显的性能提升，比如IE浏览器、Office办公这类的软件。特定的程序很能够充 分利用64位CPU、更多的寄存器带来的优势，比如MMX除了能提升多媒体程序的性能，对矩阵、多项式、向量计算都能带来提升，更多的MMX寄存器、更大 的寄存器字长都有利于SIMD指令的执行，能够提升CPU对数据的吞吐量（RISC指令集的CPU动不动就有数百个寄存器，可以有效的缓存中间计算结果， 不需要把中间结果写入内存，从而减少内存访问次数，显著提升性能）

### 内存容量与操作系统位数的关系

#### 地址总线

> 在早期的PC机中，采用的是三总线结构：数据总线，地址总线和控制总线。在现在的PC机中，一般使用了总线复用功能。如在PCI总线中，地址总线和数据总线总是分时复用的。

**地址总线** 的数目决定了CPU的 **寻址范围** ，这种由地址总线对应的地址称为 **物理地址**

32根地址总线：一般情况下32位的CPU的地址总线是32位，也有部分32位的CPU地址总线是36位的，比如用做服务器的CPU。提供的可寻址物理地址范围 为 2^32=4GB。（ **所以在32位CPU和32位的操作系统中，理论上最大支持的内存为4G** ，实际上只有3.2G左右）

64位CPU地址总线一般采用的是36位或者40位。（即CPU能够寻址的物理地址空间为64GB或者1T）

#### 物理地址，线性地址，逻辑地址

  * 物理地址（Physical Address）： 刚刚讲过了，由CPU地址总线的位数决定

  * 线性地址（Linear Address）： 如果没有开启分页机制，线性地址就等于物理地址。如果开启了分页机制，线性地址到物理地址需要经过二级地址转换。线性地址可以很大，但最终要运行在物理地址上，而缺页机制和进程挂起等，就是为了让远比物理内存大的程序，运行在如此小的物理内存中。

  * 逻辑地址（Logical Address）： 指分段机制提供的地址，由段部分和一个便宜部分构成。段机制是虚拟地址到线性地址的基础。线性地址 = 段基址 + 偏移地址。

逻辑地址经过段式映射（Segmentation Translation）到线性地址。线性地址经过页面映射（Page Translation）后，得到物理地址。

> C语言指针编程中，可以读取指针变量本身值(&操作)，实际上这个值就是 **逻辑地址** ，它是相对于你当前进程数据段的地址，不和绝对物理地址相干。

## AMD 与 Intel

Intel先是自己搞了个x86架构，然后amd拿到了x86的授权也可以自己做x86了。接着intel向64位过渡的时候自己搞了个ia64（x64架构）但是因为和x86架构不兼容市场反应极差，amd率先搞了x86的64位兼容（32和64的混合架构）也就是后来的x86-64，后来Intel也拿到了生产这货的授权（i和a两家专利交叉的很严重），也搞了x86-64，因为amd先搞出来的所以x86-64也叫amd64

到目前为止intel和amd的x86架构cpu虽然指令集上有很大差别了但是还是相互兼容的，所以软件可以直接用。

## ARM与Intel (X86)架构及其他

> 早期的cpu有两个设计思路，1是把cpu内的逻辑电路做的非常复杂，这样可以直接用cpu硬件实现复杂指令，这个叫复杂指令集cisc；另一个思路是尽可能把cpu做的简单，依靠简单指令的组合迭代完成复杂指令，这个叫精简指令集risc。

  * Intel - 复杂指令集（CISC）
早期的x86是cisc的代表，后来的发展中逐步引入了risc的部分理念，将内部指令的实现大量模块化，准确来说是一个cisc外加risc部分技术的架构。

  * ARM(Advanced RISC Machines)- 精简指令集（RISC）
arm是risc的典型代表，不过在arm的发展过程中引入了部分复杂指令（完全没有复杂指令的话操作系统跑起来异常艰难），所以是一个risc基础外加cisc技术的cpu。

  * mips是一个学院派的cpu，授权门槛极低，因此很多厂家都做mips或者mips衍生架构。我们平时接触到的mips架构cpu主要用在嵌入式领域，比如路由器。

> ARM从来只是设计低功耗处理器，Intel的强项是设计超高性能的台式机和服务器处理器。
>  目前无论mips还是arm，性能和主流x86差距都很大，不过arm贵在便宜低功耗，mips则纯计算能力很强

### 手机处理器

目前ARM架构占据手机处理器90%的市场份额

## Ref

<https://www.cnblogs.com/little-YTMM/p/5058354.html>
<https://zh.wikipedia.org/zh-cn/X86>
<https://www.zhihu.com/question/63627218>
<https://zhuanlan.zhihu.com/p/21266987>
<https://blog.csdn.net/u012861978/article/details/51871315>
<https://www.cnblogs.com/little-YTMM/p/5058354.html>
<https://baike.baidu.com/item/%E6%89%8B%E6%9C%BA%E5%A4%84%E7%90%86%E5%99%A8>
