CPU访问内存

1. CPU总线周期

总线周期,包含若干个时钟周期,计算机是在时钟脉冲下一个节拍一个节拍的工作。看下面这张图,我们可以很好的理解为什么要时钟了:


这个图我们可以认为是一个基本的读内存数据的总线周期:

  1. 在T1时钟周期期间,CPU往总线上发地址信息,以指出要寻址的存储单元;

  2. 在T2时钟周期间,撤销地址,总线低16位置为高阻状态,为传递数据做准备;

  3. 在T3时钟周期间,CPU将数据读至数据总线上;

  4. 在T4时钟周期间,结束这个总线周期;

以上过程略去了某些步骤,不过用于理解这些原理是足够的。从以上过程看,我们就可以理解了我们CPU干活是按时间来的,如T1时钟周期CPU放地址到总线上,然后T2就去准备接收数据。在T1周期内并没有一个其他的标记告诉CPU T1时间放至的地址信息已经被处理请执行下一个动作。没有!!整个过程中,时间本身就是标记!时间到了就去做下一个动作吧!这就是时钟周期的重要性。

所以我们电脑的主频频率还是很重要的,主频频率越高,那么时钟周期就越短,时钟周期越短,那么一个如上面的读内存数据的操作耗时就越少,给你的感觉就是,这个电脑的性能真不赖:)给妹子选电脑时是不是又多了一个绝技!哈哈。。。。这个部分暂且到此按下不提。

2. 存储体

我们都知道CPU读物理内存中数据,是先在地址线上给出地址,然后从数据线上将数据取走,如下图所示:


地址从地址线上给出,然后数据从16位数据线(DB)上取走,注意:16根数据线一次取走的就是2个字节的数据!!!所以这个存储体称为16位存储体。在这种存储体中,最小的单位就是取两个字节。有时我们真的只需要取一个字节就好。那该怎么办?给CPU配置8位的存储体,配置8位的存储体后,那我想按字节读取数据又该如何呢?

天才的科学家总能找到办法,我直接看奔腾32位CPU连接存储是如何设计的,请看下图:


其中, D0~D31是连接到CPU对应的32根数据线上,我们这个图中,总共有4块内存接到CPU,每块内存为1GB,所以总共是4GB大小。每块存储都是8位的存储体,BEx为选通信号,也就是BE0,BE1,BE2,BE3分别对应的数据线地址为D7~D0,D15~D8,D23~D16,D31~D24。

3. 访问存储

通过上面的接法,CPU可以按照双字,字,字节访问存储。

3.1 按双字访问

按照双字访问存储时,以CPU的A31~A2地址去寻址双字存储空间,而A1,A0通过CPU内进行译码以控制BE0,BE1,BE2,BE3同时选择这四块存储进行数据的读取。而且,从双字地址(A31~A2)的角度看,地址是连续的。而每次读取到的都是双字,真是很巧妙的设计。

3.2 按字访问

按字访问时,以CPU的A31~A2地址去寻址字的存储空间,A1,A0经过CPU译码后,控制BE0,BE1,BE2,BE3,中只同时选中两块相邻的内存。

3.3 按字节访问

按字节访就是每次只控制BE0,BE1,BE2,BE3,使得只有一个存储被选中,那么就只读取了一个字节。

对于非对齐的字或者双字需要两个周期才能够取得,看下表,可以自己举个例子对照上面的接线图看看:


4、学了就要应用

编程过程中#pragma pack(n),可以设置编译器对齐字节数,那么CPU后端是怎么实现的,通过本篇文章应该有更深入的了解了。

另外,我们看一个真实世界里的内存:


图里标示为4GB的内存条,看见木有,有4块物理内存块!!!就是我们上面说的单个1GB的8位存储体。

有的企业级服务器可以插很多条内存,但是没有插满时对内存条的插入的插槽位置是有要求的,通过本文是不是可以可以理解大概是什么原因了呢???

另外还有网上总是说的选择对齐的一个原因:不同各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。16位存储体就只能从偶数地址开始读取。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值