内存单元的物理地址是由其所处的地址总线上的位置决定的,机器安装完成后,其物理地址是固定的、不变的,并不是由CPU分配的。

cpu只需要告诉控制器它要存取的内存单元地址;要找到这个地址单元则交给成组的地址译码器(如74LS138)实现。

物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。

逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

这里有一个可能会和你的认识冲突的事实:我们总是认为存储空间只是指内存(RAM),就是程序一直在读写的那个东西,实际上大部分处理器的读写请求也确实是被北桥转发给了内存模块,但并不是所有的。物理存储地址空间同时也被用来和一些主板上的其他设备通信(这种通信被称为memory-mapped I/O),比如显卡和大部分的PCI设备(扫描仪、SCSI设备之类的),还有存储有BIOS的闪存。

当北桥接收到一个物理地址请求,北桥会决定这个请求该转向哪里:内存?还是显卡?北桥根据存储地址映射表来决定。对物理存储地址的每一个区域,存储地址映射表都知道究竟是哪一个设备拥有这些地址。大部分的地址都映射到内存中,但当地址不属于内存时,存储地址映射表会告诉芯片组哪个设备该响应这些地址的请求。这种将地址分配到其他设备的映射导致了在老式PC存储中640KB到1MB之间的空洞,而保留给显卡和PCI设备的地址又造城了一个更大的空洞,这也是为什么32位操作系统不能完全使用4GB内存的原因。在Linux中/proc/iomem文件清楚的列出了这些被映射的地址。下图展示了Intel PC的前4GB地址空间中典型的映射关系:

实际的地址和范围取决于电脑中使用的主板和设备,不过大部分的Core 2系统和上图中展示的非常相似。所有棕色的区域都不属于内存,这里要明确一点,这里所说的地址是在主板总线中实际的物理地址,在CPU内部(例如程序中的运行、读写地址)使用的地址都是逻辑地址,并且在实际访问之前都必须被CPU转换成物理地址。

地址译码器:就是把输入的二进制数地址,指向相应的物理空间。这实际上就是一个转换或者翻译的过程。

地址译码器是在内存内部的,内存除了存储单元外,还包括:读写电路、地址译码器。 
地址译码器,就是cpu通过地址总线给内存一个地址说:我要读这个地址,或者写这个地址了。内存中的地址译码器负责找到这个地址,然后通过读写电路进行读写。

存储器地址译码有两种方式,通常称为单译码与双译码。 (1) .单译码 单译码方式又称字结构,适用于小容量存储器。 (2) .双译码 在双译码结构中,将地址译码器分成两部分,即行译码器 ( 又叫 X 译码器 ) 和列译码器 ( 又叫 Y 译码器 ) 。 X 译码器输出行地址选择信号, Y 译码器输出列地址选择信号。行列选择线交叉处即为所选中的内存单元,这种方式的特点是译码输出线较少。

为了读取特定单元格的数据,在寻址时要首先确定是哪一个bank,然后在这个选定的bank中进行行列的寻址。在实际工作中,bank的地址与相应的行地址是同时发出的,此时这个命令称之为"行有效"或者“行激活”。在此之后,发送列地址寻址命令和具体的操作命令(读或写),这两个命令也是同时发送的。行列地址是可以复用的,一般来说DDR芯片的地址线为A0~A15,低地址线会被行列复用。以K4B4G1646B 4Gbit 256MB x 16bit内存芯片为例,A0~A14用做行地址,A0~A9用做列地址,这款芯片同时含有B0~B2用来选择bank。

在实际工作中,Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。

下面来看一个具体例子。
该例子中,用两个16bit的DDR3内存拼成了一个32bit的DDR3.
每块16bit DDR3的大小为512M Bytes.
看看硬件上连接:
第一片16bit DDR3的BA0, BA1, BA2连接到了CPU的BA0, BA1, BA2。
第二片16bit DDR3的BA0, BA1, BA2也连接到了CPU的BA0, BA1, BA2。
第一片16bit DDR3的A0~A14连接到了CPU的A0~A14。
第二片16bit DDR3的A0~A14连接到了CPU的A0~A14。
第一片16bit DDR3的D0~D15连接到了CPU的D0~D15。
第二片16bit DDR3的D0~D15连接到了CPU的D16~D31。

分析下该实例。
bank address有三个bit,所以单个16bit DDR3内部有8个bank.
表示行的有A0~A14,共15个bit,说明一个bank中有2^15个行。
表示列的有A0~A9,共10个bit,说明一个bank中有2^10个列。
来看看单块16bit DDR3容量:
2^3*2^15*2^10=2^28=256M
我们的内存是512M,到这儿怎么变成256M了?被骗了?
呵呵,当然没有。
忘了我们前面一直提到的16bit。
16bit是2个byte对吧。
访问一个地址,内存认为是访问16bit的数据,也就是两个字节的数据。
256M个地址,也就是对应512M的数据了。

每一块16bit DDR3中有8个bank,2^15个row,2^10个column。也就是有256M个地址。
看前面的连线可知,两块16bit DDR3的BA0~BA2和D0~D14其实是并行连接到CPU。
也就是说,CPU其实认为只有一块内存,访问的时候按照BA0~BA2和D0~D14给出地址。
两块16bit DDR3都收到了该地址。
它们是怎么响应的呢?
两块内存都是16bit,它们收到地址之后,给出的反应是要么将给定地址上2个字节送到数据线上,要么是将数据线上的两个字节写入到指定的地址。
再看数据线的连接,第一片的D0~D15连接到了CPU的D0~D15,第二片的D0~D15连接到了CPU的D16~D31。
CPU认为自己访问的是一块32bit的内存,所以CPU每给出一个地址,将访问4个字节的数据,读取/写入。
这4字节数据对应到CPU的D0~D31,又分别被连接到两片内存的D0~D15,这样一个32bit就被拆成了两个16bit.
反过来,也就是两个16bit组成了一个32bit.
CPU访问的内存地址有256M个,每访问一个地址,将访问4个字节,这样CPU能访问的内存即为1G.

参考文章:

https://www.cnblogs.com/felixfang/p/3420462.html

https://blog.csdn.net/qq_35623393/article/details/80277496

https://www.jianshu.com/p/5d3196f64a29

https://blog.csdn.net/joqian/article/details/17676485

http://blog.sina.com.cn/s/blog_730a3f0f0101kozi.html

http://www.doc88.com/p-7972044584992.html

https://blog.csdn.net/davion_zhang/article/details/50604934

DRAM内存物理地址和地址译码器原理的剖析相关推荐

  1. Spark PersistenceEngine持久化引擎与领导选举代理机制内核原理深入剖析-Spark商业环境实战...

    本套系列博客从真实商业环境抽取案例进行总结和分享,并给出Spark源码解读及商业实战指导,请持续关注本套博客.版权声明:本套Spark源码解读及商业实战归作者(秦凯新)所有,禁止转载,欢迎学习. Sp ...

  2. Spring 框架之 AOP 原理深度剖析!|CSDN 博文精选

    作者 | GitChat 责编 | 郭芮 出品 | CSDN 博客 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构 ...

  3. 唯一插件化Replugin源码及原理深度剖析--插件的安装、加载原理

    上一篇 唯一插件化Replugin源码及原理深度剖析–唯一Hook点原理 在Replugin的初始化过程中,我将他们分成了比较重要3个模块,整体框架的初始化.hook系统ClassLoader.插件的 ...

  4. Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  5. 【转】Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  6. 《影响力》承诺和一致原理深入剖析,人们对自己的选择是很相信的

    <影响力>承诺和一致原理深入剖析,人们对自己的选择是很相信的 如果不了解<影响力>这本书请看之前的文章: <影响力>6个使人顺从的武器之一互惠原理深入剖析 愚蠢的五 ...

  7. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  8. 《影响力》6个使人顺从的武器之一互惠原理深入剖析

    <影响力>6个使人顺从的武器之一互惠原理深入剖析 互联网时代人们更加不愿意动脑子来做选择,从而使得无意识的顺从行为更加普遍. <影响力>每一个原则均能使人产生不同的自动.无意识 ...

  9. 深入解读 MySQL 架构设计原理,剖析存储架构选型核心

    孙玄,江湖人称"玄姐",前58集团技术委员会主席,前转转二手交易平台首席架构师.今天想跟你聊点儿企业里那些年薪百万的架构师,他们的架构设计思维是如何升级的,以及他们是如何玩转 My ...

  10. 内存映射文件mmap原理分析

    本文来说下内存映射文件 mmap 原理 文章目录 mmap原理分析 mmap原理分析 假设我们要把一个磁盘文件映射到内存里来,然后把映射到内存中的数据通过socket发送出去. 零拷贝有两种实现方式, ...

最新文章

  1. Linux内核Makefile
  2. 高并发编程-自定义简易的线程池(1),体会原理
  3. typedef struct 先声明后定义_C++模版和C#泛型求同存异录(二)typedef
  4. 信息学竞赛相关优秀文章合集[持续更新]
  5. [css] 当页面采用rem布局时,如何解决用户设置字体大小造成的页面布局错位?
  6. innerdb disable error
  7. 海量数据挖掘MMDS week6: 支持向量机Support-Vector Machines,SVM
  8. 论文笔记_S2D.67_CamVox: 一种低成本、高精度的激光雷达辅助视觉SLAM系统
  9. vs2012 ultimate 密钥
  10. react JSZip-压缩文件下载本地
  11. Unity基础到入门-导航系统(Navigation)
  12. mysql的四大特性(AICD)
  13. 总有些中文情歌,让我莫明的感动了
  14. 回炉重造--PHP编程速成
  15. 计算机公司客户电话怎么打,企业微信公费电话怎么打多人通话【方法】
  16. 如何避免扫码枪重复扫码
  17. CVPR 2022 | 百变发型!中科大/微软/港城大提出HairCLIP:基于文本和参考图像的头发编辑方法...
  18. Django与vue
  19. Storm之——搭建Storm集群
  20. BadUSB橡皮鸭WinLinux通用下载者

热门文章

  1. 单元测试报告软件测试,软件单元测试报告-模板
  2. 恒定湿热试验条件及标准-环境试验中的湿热试验报告
  3. java象棋人机_Java版中国象棋人机对战源代码(AI算法体现淋漓尽致)
  4. Sybase数据库的备份
  5. vector_map矢量化地图的生成方法
  6. SmartMesh WireLess HART 资料总结
  7. Spring-Boot开发者工具:自动重启、LiveReload、远程开发
  8. 论福禄克DTX-1800如何测试CAT7网线?
  9. MATLAB中的转置 和 复数的共轭转置
  10. Java性能优化面试题汇总