按字或者按字节编址,是不是说一个存储单元的位数就与字或字节的位数相同?

按字或者按字节编址,是不是说一个存储单元的位数就与字或字节的位数相同?

· json · rss
Subscribe:

About

#计算机组成原理#存储单元和字的大小没有必然的关系。

同样,地址也和字的大小没有必然关系。

一个存储单元里面可以包含了多个字,地址也可以由多个字复合而成。

存储单元中包含多个字的就叫做多字存储器。

注意:在这里声明一下,在计算机中字有着很多意思,单独拿出来说的时候是指CPU进行整数运算的字的大小,但是在存储器这里指存储字长,等于数据线的宽度。

为什么要开发多字存储器呢?

因为CPU的速度很快,远快于存储器。当CPU请求一个地址内容后,会将硬盘的数据转送到主存里面,再转存到CPU中。如果单字的话,那么许多个存取周期后才能完成运输,造成了整体上的速度的短板效应。如果我们采用多字存储器的话,例如8字存储器,那么可以将转运时间减小到1/8.可以极大的减小IO所浪费的时间。

同样32位的地址可以索引4GB的空间,但是64位的地址索引的空间又太大了,因此在当前版本的AMD64架构就规定了只用48位地址;一个表示虚拟内存地址的64位指针只有低48位有效并带符号扩展到64位——换句话说,其高16位必须是全1或全0,而且必须与低48位的最高位(第47位)一致,否则通过该地址访问内存会产生#GP异常(general-protection exception)。
只用48位的原因很简单:因为现在还用不到完整的64位寻址空间,所以硬件也没必要支持那么多位的地址。
设计为带符号扩展的原因也很简单:很多环境中,寻址空间的高一半(higher-half)有特殊用途,而低一半(lower-half)给用户做一般用途。这“高/低”可以通过最高位是1还是0来判断;如果把地址看成带符号整数,那么“负数”部分就是高一半,“正数”部分就是低一半。所以AMD64在设计成只用64位中的48位时,要求canonical form要满足带符号扩展的要求。以后就算允许更多位地址,满足当前限制的地址也仍然会是合法地址,保证了向前兼容性。

在古老的DOS时代,也会用两个16位的字来描述20位的地址。如果学过汇编的话,那么这个将很容易理解。

结论:存储单元包含的字的多少与字的位数无关,地址也不一定为一个字的大小。

推荐一本好书,欢迎大家购买