CPU访问内存

来源:互联网 发布:神漫软件下载 编辑:程序博客网 时间:2024/05/16 15:45

首先我们需要一个引子,引子如下:

作为一个计算机领域的工程师,这里有一个问题:有一个10米深的水池需要测量其水深,并在计算机(或者微机)上显示测量结果,保留小数点后一位。请概要的设计这个系统。

分析如下:

10米深的水池,需要保留一位小数,所以测量精度应该是0.1米,如下图所示: 


采样的方法,我们采用最简单的水漂,即随水深上下浮动,带动滑线变阻器。

水漂上下浮动,那么接通的电阻值就不一样,电阻不一样,那么产生的电压就不一样,电压不一样,就可以通过模拟信号到数字信号的转换器进行转换,由于我们有100个刻度需要标示,需要需要一个8位的A/D转换器才可以达到我们的精度,设计概要图如下:

从上面来看,基本原理就出来了,然后是数据的处理,采样数据设计如下:


所以通过上面的值数值对照表我们就可以计算出水的深度了。那么说了这么多,到底想表达什么意思呢?

其实我就是想通过一个栗子来表述模拟电路和数字电路之间的区别和转换,计算机处理的都是经过转换的数据也就是0和1。相信各位对于这个问题已经很明白了或者之前就很明白。

知道了这些个原理对于一个搞技术的,在看待某些问题时就会更彻底。比如如果要提高测量精度,那么我们就需要使用更好的A/D转换器等等。某些情况下知道这些原理,相信对于各位把妹子也很有裨益的:)

说完了模拟信号的世界,还是回到我们0和1的世界,来说说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位存储体就只能从偶数地址开始读取。

通过本篇文章应该有所收获吧?

后面会持续更新C语言和Linux文件系统方面的文章,如感兴趣,请关注:


0 0