内存是由很多个内存单元组成的,每个内存单元占8个bit位(1字节),也就是说内存中有多少个内存单元就意味着可以存储多少个字节,下面是一个只有两个内存单元的内存概念图:
该图为博主自己画的概念图并非PCB板的设计图!
注意上图只是根据CPU通过前端总线与北桥和内存之间进行交互画的概念图,并非真正PCB设计图,这里只是讲解CPU是如何与内存单元通讯的。
地址总线:
地址总线的位宽决定了CPU的寻址范围能力,地址总线越多CPU能寻址的范围也就越大,地址总线就相当于计数器,告诉我们寻址范围,地址总线是连接在内存的电路接口处的,地址总线的位宽以2的次方来算。
上图是一个有两个内存单元的RAM,所以一根地址总线就可以表示,2的1次方为2,所以CPU的寻址最大范围是2,对应的编号就是00,01,内存中的存储顺序是以0开始的,这也是为什么数组下标都是以0开始。
数据总线:
数据总线决定了内存中有多少bit位,当通过地址总线找对应的内存单元时可以通过与指
定内存单元连接的数据总线将数据传送回来! 数据总线的位宽决定了一次可以传送多少个
bit 位回来,一般均为8bit!
位宽不能代表有多少根数据总线.位宽决定了数据总线一次传输bit 位的能力,比如上图有两
个内存单元,CPU 通过地址总线找到了第二个内存单元的地址,此时的数据总线位宽为:
位; 那么一次可以将第二个内存单元里的bit 全部读取出来,那么倘若将第一个内存单元和
第二个内存单元全部读取出来,那么需要分两次来读,如果数据总线的位宽是16 位,那么
可以一次读完,数据总线的位宽是和地址总线直接挂钩的,假如说数据总线的宽度是32 位,
每一次读取数据都会动用32 根数据总线来读取,也就是一次可以读取4 字节,同时地址总线一次寻址范围也必须能够满足4字节,也就是说每一次寻址都需要2根地址总线!
如果地址总线不满足要求则会出现硬件中断等,还有就是如果地址总线的一次寻址范围是4字节倘若数据总线跟不上的话则会分开读取!不过一般情况下数据总线的位宽是和地址总线的位宽成正比例的,这也是为什么C语言和很多编程软件会有内存对齐机制!
控制总线:
控制总线告诉CPU对这块内存单元做怎样的操作,读还是写,同样控制总线也是接在电路接口处的,控制总线的位宽决定了CPU能对电子元件有多少种控制方法,一般情况下内存中只有一根控制总线,因为一般情况下内存就是读与写!
上面介绍的是地址总线,数据总线,控制总线都属于前端总线,前端总线是将CPU与北桥芯片和内存连接起来的通讯线路,因为内存不属于CPU内部结构单元,内存是在主板上的所以CPU是不能直接操作内存的,需要通过前端总线与北桥交互,北桥芯片通过外部总线将内存中的数据送到一级缓存中去,CPU在通过内部总线将其取到寄存器中!
当然除此之外还有其他总线:
外部总线:
用来连接各种外设控制芯片,如主板上的I/O控制器,(如硬盘接口控制器、软盘驱动控制器、 串行/并行接口控制器等),和键盘控制器,包括外部地址线(XAB),外部数据线(XMB)和外部控制线(XCB)。
内部总线:
将处理器的所有结构单元内部相连,它的宽度可以是8,16,32,或64位。如在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为内总线即芯片内部的总线),内部总线也分地址总线(AB),数据总线(MB),控制总线(CB)
系统总线:
前端总线,外部总线都属于系统总线,系统总线就是连接CPU,存储器,和一切外部设备的通路,内部总线不属于系统总线,因为内部总线是CPU内部用于连接内部结构单元的通讯线路!
这里要说一下北桥与内存连接的前端总线是内存上的,与CPU连接的前端总线是北桥与CPU连接的前端总线,北桥与CPU连接的前端总线的位宽决定CPU内部的一级缓存的寻址范围,北桥先通过数据总线取出值,然后通过与CPU连接的前端总线将数据送往一级缓存中,送入一级缓存时会顺序的写入!倘若一级缓存爆满,则会等待CPU处理完毕在写入!
CPU要往内存中写数据的话也是如此,通过与北桥连接的前端总线将要寻址的地址通过地址总线传输过去然后通过数据总线将数据发送过去,在通过控制总线告诉北桥芯片往内存里写数据,最后在由北桥通过与内存连接的前端总线将数据写到内存中的指定内存单元里!
注意这里要说一点的是,当CPU向内存中写数据时,与CPU连接的前端总线的地址总线位宽是一级缓存的位宽,那么怎么表示内存中的寻址范围呢?
答:当CPU向内存中写数据时通过地址总线将要选中的地址码发给北桥芯片(在这里位宽只表示一次能发送多少个bit位),而北桥获取这个地址码后根据地址码通过与内存连接的地址总线选中内存中响应的内存单元,与内存连接的地址总线位宽决定内存中的寻址范围大小,当你的寻址范围大小超过地址总线的位宽时北桥则不会去寻找,直接报硬件中断错误!
重点:
北桥是根据与内存连接的地址总线的位数来判断内存中有多少个内存单元的!
注意在购买CPU时要看好前端总线是否被CPU支持,比如8086的CPU一次寻址时要求前端总线必须是16的倍数,也就是说CPU一次寻址范围必须大于16个bit位(两个字节),刚好一个前端总线即可表示!
总结:
CPU在读取内存中的数据时先通过前端总线与北桥交互,北桥芯片将内存中的数据送到一级缓存中,在由CPU通过内部总线将一级缓存中的数据取出放到指令寄存器里,然后执行,这里怎么区分读或写?首先内存中的指令是组合好的,一条完整的指令是由操作码地址码操作数组合完成,CPU根据操作码决定执行那些操作,在CPU指令集里读和写的指令集是区分开的,通过地址码选中对应的地址,将立即数写入,如果是读的话没有立即数!
这里讲一个读的过程:
从内存单元00读出放到内存单元01中:
CPU先与北桥交互取出00内存单元中的数据放到一级缓存中,CPU在通过内部总线将其取出放到通用寄存器里,最后在将其通过前端总线与北桥交互放到内存单元01处!
在挑选CPU时前端总线必须是CPU支持的,否则无法正常运行,比如8086CPU支持的地址总线位宽必须是16的倍数,也就是说如果你的前端总线位宽不足以16的话将无法正常工作。
最后在给大家看一下内存单元究竟是怎样的:
上图的存储器属于较老版本的,现代的内存条都已经将存储单元封装起来了,不可见!
这里拿出来只是为了让大家知道内存单元长什么样子,现代的内存条内存单元非常小容量却没有任何变化!