在复习计算机组成原理的时候遇到了一道挺简单的题,但当时琢磨了挺长时间。
设CPU有20根地址线和16根数据线,求CPU按字节访问的地址范围是多少,CPU按字访问的地址范围是多少。
CPU按字节访问的地址范围是多少。当时觉得这么容易:不就是 2 20 × 16 / 8 = 2 M 2^{20} \times 16 / 8 = 2M 220×16/8=2M嘛,按字访问那就是 2 20 = 1 M 2^{20} = 1M 220=1M,这有什么。当时看答案。
我想半天没想明白,怎么会是1M呢,上面的算式算了几遍确定没算错,于是搜索了一下,但也没有看明白。
课本上的相关内容似乎也是一笔带过,没有解释。于是意识到这是因为对定义的错误认识。
按字节寻址
按字节寻址是指地址线所表示的一个地址对应一个字节的位置。而上述题中20根地址线,共能表示 2 20 = 1 M 2^{20}=1M 220=1M的地址,一个地址对应一个字节,所以按字节寻址范围是1M。
按字寻址
由于每个字由多个字节,为了对字节进行定位,需要分出一些地址线用于定位字节,其余的地址线用于地址编号。所以上述题中一个字是两个字节,所以按字访问范围是512K。
区分
我一开始将此处与下面这种情况搞混了,才犯了错误。
这里规定按字寻址,所以块内地址范围是4,即需要2位地址;Cache地址范围是4K,即需要12位地址;主存地址范围是512K,即需要19位地址。
可以看出其实这两种本来就是一样的,只是从不同方向来推导。第一种是从地址位数来推出地址范围,第二种是已知地址范围来推出地址位数。
从地址位数来推出地址范围,第二种是已知地址范围来推出地址位数。
而一开始我的问题出在:将每根地址线都对应一个字,而每个字再分为两个字节,但是实际上这样做没有考虑到字内寻找字节也需要地址线,这样原来的20根地址线是不够用的,需要21根地址线。问题出在将地址线的根数和寻址地址位数搞混了,地址线不一定全部用于地址编号。