CPU 最核心的组件, 中央处理器 Central Processing Unit
Bus 总线, CPU 和 其它设备连接的桥梁、其实就是主板上密密麻麻的集成电路
内存 最重要的设备、与CPU一样、是完成计算任务的核心组件
cpu 包含 运算单元、数据单元 和 控制单元
运算单元: 负责计算, eg. 加法、移位等. 但不知道结果存放在哪里
若每次通过总线到内存去拿、速率很低、所以有了数据单元
数据单元: 包括CPU内部的缓存和寄存器组、空间小、速度高、可暂时存放数据和运算结果
控制单元: 同一指挥中心、获取指令 & 执行指令, 会指导运算单元取出数据单元中的某几个数据、计算出结果、然后存放在数据单元的某个地方
CPU这么执行程序, 操作数据, 并将结果写回内存的呢 ?
1 | CPU的控制单元里, 有一个指令指针寄存器、存放的是下一条指针的地址, 控制单元会不断将代码段的指令拿进来、写入指令寄存器 |
CPU 和 内存进行数据交换、靠的是总线
Bus, 分为地址总线和数据总线
地址总线的位数、决定可寻址范围, eg 只有两位、那CPU只认00011011四个位置
数据总线的位数、决定一次可以拿多少个数据进来、eg. 只有两位、CPU一次只能拿2位数、要想拿8位就需要4次、位数越多、一次拿的数据就越多、访问速度也越快
8086 系统架构
8个16位通用寄存器 AX BX CX DX SP BP SI DI主要用于计算过程中暂存数据 (数据单元)
IP 指令指针寄存器Instruction Pointer Register 指向代码段下一条指令的位置, CPU根据它从内存的代码段加载指令到CPU的指令队列中、交给运算单元去执行
段寄存器:
CS 代码段寄存器, 保存代码在内存中的位置 Code Segment Registeer
DS 数据段寄存器, 保存数据在内存中的位置 Data Segment Register
SS 桟寄存器 Stack Register 程序运行中的一个特殊结构、存取只能从一端进行
ES
若运算中需要加载内存中的数据、需要通过
DS找到内存中的数据, 加载到通用寄存器中该如何加载?对于一个段、有一个起始的地址、而段内的具体位置、称为偏移量 Offset
在CS和 DS中都存放着一个段的起始地址、代码段的偏移量在IP寄存器中、数据段的偏移量通常在 通用寄存器中
那么问题来了:
CS和DS都是16位的、即: 起始地址都是16位的、
IP寄存器和通用寄存器都是16位的、即: 偏移量也是16位的
但: 8086 的地址总线是20位、怎么做?
1 | 起始地址*16 + 偏移量, 即: 把CS和DS中的值、左移4位 + 16位的偏移量 得到20位的数据地址 |
so. 无论真正的内存是多大、对于只有20位地址总线的8086来说、能识别出的地址只有 2^20 = 1M
偏移量是16位、段大小最大为 2^16 = 64k
32位处理器
在32位处理器中、有32根地址总线、可以访问 2^32=4G 的内存
那如何去兼容原有8086架构呢?
- 通用寄存器扩展、将8个16位的扩展到8个32位的、保留8位和16位的使用方式

改动较大的是 段寄存器(Segment Register)
CS、DS、SS、ES 还是16位, 但不再是段的起始地址、段的起始地址放在内存、该内存是一个保存了段描述符的表格、段寄存器中保存的是在表格中的哪一项、称为选择子(Selector)
这种模式灵活度比较高、将来也可以一直兼容、前边的设计就不够灵活
前一种模式、称为 实模式 Real Pattern, 后一种模式称为保护模式 Protected Pattern

参考: