1.认识计算机总线
冯诺伊曼计算机结构
总线是连接多个部件的信息传输线,是各部件共享的传输介质。输入输出设备可以和主存通信而不用影响CPU的工作,这样CPU的工作效率得到了很大的提升。
- 系统总线: 用于IO接口、主存、CPU之间的信息传输,IO和CPU之间只传输指令信息。
- 主存总线: 专门用于主存和CPU之间的信息传输
1.2 系统总线的分类
- 数据总线:
数据总线用来传输各功能部件之间的数据信息,它是双向传输总线,其位数就是数据总线的宽度。总之是用来传输数据的。
- 地址总线:
地址总线主要用来指出数据总线上的源数据或目的数据在主存单元的地址或者I/O设备的地址。总之就是传输数据所在地址。
- 控制总线:
由于数据总线、地址总线都是被挂在总线上的所有部件共享的,如何使各部件能在不同时刻占有总线使用权,需依靠控制总线来完成,因此控制总线是用来发出各种控制信号的传输线。总之是用来传输控制指令的。
2.CPU结构
CPU的结构
CPU基本由运算器、cache、控制器三大部分构成。
3.IA32、IA64、AMD64、Intel64
IA32、x86、x86-32
IA-32为Intel Architecture 32bit简称,即英特尔32位体系架构,在英特尔公司1985年推出的80386微处理器中首先采用。通常也被称为i386、x86-32、x86等。
IA64
IA64是后来intel和惠普联合推出的64位体系架构,但是不兼容原有的32位体系结构的应用程序,导致市场惨淡。
AMD64、x86-64、x64、
和 Intel64、CT、IA-32E、EM64T
后来AMD推出了兼容32位的64位集关于IA-32的扩展,称为x86-64或者x64,之后改名为AMD64。
Intel后来也采用该架构,先后使用Clackamas Technology (CT)、IA-32E、EM64T(Extended Memory 64 Technology),最后命名为Intel64。
4.8086名字的由来
当intel发明第一颗4位的位处理器的时候,intel把他叫4004.编号为4004,第一个“4”代表此芯片是客户订购的产品编号,后一个“4”代表此芯片是intel公司制作的第四个订制芯片。
因为4004的指令集很有限,所以又搞出来了一个升级版本4040.
8008是4004的8位版,8080是4040的8位版。
8085是8080的单5伏电压版
8085升级到16位后,就叫8086了
80286最后一款16位处理器
80386第一款32位处理器
80486英特尔最后一款以数字为编号的
之后进入奔腾(Pentium)、酷睿(Core)时代
5.CPU位宽与其寻址能力并不是挂钩的
CPU的位宽一般是以 min{ALU位宽、通用寄存器位宽、数据总线位宽}决定的!也就是说CPU由ALU、通用寄存器、数据总线三者之中最少的位宽决定!所以CPU位宽与其寻址能力并不是挂钩的!
事实上CPU寻址能力因每种CPU设计不同而不同!就比如说32位的X86CPU,其实就在PentiumII是引入了36位的扩展PAE机制(Physical Address Extention)地址位来支持64G内存(源于当时服务器的问题),正常情况下也是用32位寻址,但通过设置相应的寄存器(没记错是cr4)的相应位**PAE就可以支持64G内存了!
Intel的32位架构下,可使用的地址线是36个,可使用的最大物理地址是2^36B,折合64GB,可用的地址空间是4GB。
64位架构下,地址线是46个,所以最大的物理地址是2^46B,折合64TB,可用地址空间一般为128G,如下面第7节所示,微软针对不同版本的操作系统做了不同的限制,有8G,16G,128G,192G;WIN10的有2T和6T
这里引入线性地址(也叫虚拟地址)和物理地址的概念,另外还有逻辑地址。这些地址的转换又涉及到内存的段式管理和页式管理。具体可以参见 逻辑地址、虚拟地址、物理地址以及内存管理 以及 怎样通俗的理解操作系统中内存管理分页和分段
下图是不同的CPU型号对应的地址线位数与最大的寻址地址
| CPU | CPU Address Bus Size | Maximum RAM |
| 8086 | 20 bit | 1MB |
| 8088 | 20 bit | 1MB |
| 80286 | 24 bit | 16MB |
| 80386SX | 24 bit | 16MB |
| 80386DX | 32 bit | 4GB |
| 80486SX | 32 bit | 4GB |
| 80486DX | 32 bit | 4GB |
| Pentium I | 32 bit | 4GB |
| K6 | 32 bit | 4GB |
| Duron | 32 bit | 4GB |
| Athlon | 32 bit | 4GB |
| Athlon XP | 32 bit | 4GB |
| Celeron | 36 bit | 64GB |
| Pentium Pro | 36 bit | 64GB |
| Pentium II | 36 bit | 64GB |
| Pentium III | 36 bit | 64GB |
| Pentium 4 | 36 bit | 64GB |
| Athlon | 40 bit | 1TB |
| Athlon-64 | 40 bit | 1TB |
| Athlon-64 FX | 40 bit | 1TB |
| Opteron | 40 bit | 1TB |
| Itanium | 44 bit | 16TB |
| Itanium 2 | 44 bit | 16TB |
6.为什么32位Windows中实际可用内存少于4G
虽然物理地址有4G,但CPU如果要访问你的显卡上的显存,就必须把物理地址空间的一部分用于标识显存,这种技术被称为memory-mapped I/O,这样可以让CPU操作显存像操作内存一样。
在Windows的设备管理器里,查看显卡的属性页里的“资源”,可以看到内存映射的地址范围,实际上不管32位还是64位,都需要占用一部分地址空间,32位Windows只有4G的地址空间,被显存占去了一部分,所以可用的地址空间就少于4G了
实际上不仅仅是显存,你电脑上的PCI控制器,各种网卡、声卡、USB控制器等等都需要占用一定的物理内存,所以最终的后果就是可用的物理地址范围变得特别少,最少可能只有1.99GB,这种限制在32位Windows上是不可改变的。
7.微软对各个版本的Windows的物理内存上限作出限制
PAE(Physical Address Extention)确实可以让x86硬件支持到能够访问64G的地址空间,Windows的内核也支持使用多达64G的物理地址空间,但是微软偏偏要对各个版本的Windows的物理内存上限作出限制,下面是XP和Win7、Win10的物理内存上限
虽然32位环境下实际上CPU支持访问大于4G的物理内存,但Windows将此功能屏蔽了,导致了32位Windows实际只能使用4G的物理地址空间,具体原因参见这个回答:为何微软不在新的操作系统中让 32 位支持大于 4GB 的内存? - 北极的回答