跳转至

A. 总线与内存地址空间

A. 总线与内存地址空间

更新日期:2020-05-03


1. 概述

计算机主板上的各个部件通过总线连接在一起,总线可以认为是主板上的多组导线的集合。
CPU通过总线连接和控制其他器件。而根据功能不同,总线又分为3类:

  • 地址总线:传输内存区域的地址
  • 数据总线:传输读或写的数据
  • 控制总线:传输控制信号,表明具体是什么操作

我们知道一根导线在一个时刻只能表示一种状态,也就是一位二进制数。要想表示真正有用的数据,就需要同时表示多个状态,也就需要多根导线。
导线的根数通常称为总线的宽度,导线越多能够表示的二进制数据就越大越多。

总线示意图

asm

总线连接着主板上所有的接口、插槽,再进一步连接所有的板载和外部设备。

2. 地址总线与内存地址空间

地址总线用于CPU执行操作时指定要操作的内存区域的地址。

对于CPU来说,所有的板载存储器和内存一样没有什么区别。这些存储设备主要有:

  • 板载内存
  • 内存条(也就是主存储器)
  • 主板ROM
  • 显卡ROM
  • 显存
  • 网卡ROM
  • 其他板载芯片的ROM

ROM中通常储存着一些BIOS程序,对于CPU来说,程序和普通的数据都以二进制数据的形式存放。也即程序代码、指令等也是数据,它们也需要存放在内存中才能够运行。比如我们写java程序时会有ClassLoader类来把类的代码加载到内存中。

由于CPU把上面说的这些存储器都当作通常所说的内存来使用,所以可以将所有这些存储器进行统一的编址,就好像它们整个合起来是一块巨大的存储器,每种存储器在巨大存储器内部都占据一段地址。唯一的区别可能是ROM通常是只读的,不能往那个区域写数据。

这个编址构成了内存地址空间。

地址总线就是要指定这个内存地址空间中具体的地址。地址总线的宽度就决定了它到底能指定多大范围的编号。

地址总线根数 可以指定的编号为 范围大小
1根 0、1 2
2根 0、1、2、3 4
4根 0、1、2 ~ 15 16
8根 0、1、2 ~ 255 256
16根 0、1、2 ~ (2^16 - 1) 64K
20根 0、1、2 ~ (2^20 - 1) 1M
32根 0、1、2 ~ (2^32 - 1) 4G

这个范围大小也就是内存地址空间的大小,地址总线能指定的内存地址空间的大小被称作寻址能力。

以16根地址总线为例:

内存地址空间示意图

asm

在C/C++这类直接使用指针来操作内存的语言中,指针的值就是这里的地址编号。通常编写程序时指针操作的内存区域几乎都是主存储器中的堆内存,但是要注意指针可以指向整个内存地址空间中的任何位置。

我们通常所说的32位应用程序即是指程序中使用了32位指针,也就是假设硬件系统有32根地址总线。由于32根地址总线的寻址能力是4GB,所以32位应用程序能使用的地址空间也是4GB。比如32位Windows系统就只能使用最多4G的内存。

目前的CPU都支持64位寻址,2的64次方是一个天文数字,所以64位程序几乎具有无限大的内存地址空间。而64位操作系统再也没有只能使用4G内存的限制。

3. 数据总线

数据总线用来传递数据。而数据总线的根数就决定了一次能够传输多少位的数据。

数据总线根数 每次可以传输数据的位数 每次传输数据的大小
1根 1 1比特位
2根 2 2比特位
4根 4 4比特位
8根 8 1个字节
16根 16 2个字节
32根 32 4个字节

数据总线的根数被称作数据总线宽度,它和总线频率一起决定了总线能以多快的速度传输数据,当然是越快越好了。
实际的计算机中,数据传输速度的计算过程很复杂,影响因素很多,这里没必要了解所有细节。通常我们关注一下内存条的频率就可以了,频率越高内存条越快。

4. 控制总线

控制总线用来传递指令。比如CPU向各个器件发送命令,某个器件向CPU发送请求等,都通过控制总线来进行。

对于我们平时的使用来说,控制总线可能是最不需要我们关心的总线,它的细节我们并不用深究。