内存条的组成、编址、寻址和读写方式

一、组成

这是一个2GB的DDR3内存条,我们可以看到,内存条的物理组成:金手指、存储芯片、还有各种控制电路和元器件,还有就 PCB板。我们今天要谈的组成不是这些,而是它作为一个数据容器的组成:

  • Rank
    CPU与内存之间的接口位宽是64bit,也就意味着CPU在一个时钟周期内会向内存发送或从内存读取64bit的数据。可是,单个内存颗粒的位宽仅有4bit、8bit或16bit,个别也有32bit的。因此,必须把多个颗粒并联起来,组成一个位宽为64bit的数据集合,才可以和CPU互连。生产商把64bit集合称为一个物理BANK(Physical BANK),简写为P-BANK。为了和逻辑BANK相区分,也经常把P-BANK称为RANK或Physical RANK,把L-BANK则简称为BANK。如果每个内存颗粒的位宽是8bit,应该由8个颗粒并联起来,组成一个RANK(64bit);同理,如果颗粒的位宽是16bit,应该由4个颗粒组成一个RANK。由此可知:Rank其实就是一组内存颗粒位宽的集合,也可以叫Chips,在PCB上,往往把一面上的内存颗粒组成一个Rank,另一面是另外一个Rank(假若有的话),这样也可以将Rank理解内存条的Side(面)。具体说,当颗粒位宽×颗粒 数=64bits时,这个模组就是有一个RANK。为了保证和CPU的沟通,一个模组至少要有一个RANK。但是,为了保证有一定的内存容量,目前,DDR2内存,经常是采用一个模组两个RANK的架构。“模组构成”中的“R”“RANK”的意思。“2R”是说组成模组的RANK数(Number of ranks of memory installed)是2个。有“1R”和“2R”两种;“模组构成”中的“×8”是颗粒的位宽(bit width),有×4、×8和×16三种.
  • Chip(Memory)
    存储芯片,又叫内存颗粒。真正提供存储的器件。
  • Bank
    Chip里包含多个Bank。一个Bank就是一个存储矩阵库。由Chip的BA线的位宽决定个数。
  • Cell
    存储单元,可以保存1bit的数据,Bank由很多的Cell组成,由行列来确定一个Cell。

Rank指的是连接到同一个cs(Chip Select,片选)的所有内存颗粒chips,内存控制器能够对同一个rank的所有chips同时进行读写操作,而在同一个rankchip也分享同样的控制信号。rank1和rank2共享同一组addr/command信号线,利用cs片选线选择欲读取或是写入的那一组,之后将存储内容经由MUX多路器送出。bank再往下分就是实际存储单位元的电路,一般来说横向选择排数的线路称为row(row enable, row select, word line),纵向负责传送信号的线路称为column(bitline),每组bank的下方还会有个row buffer(sense amplifer),负责将读出的row内容暂存。

二、编址

前面我们知道了DRAM颗粒以及内存模块是如何扩展字长和容量的。一个内存可能是8位,也可能是64位,容量可能是1M,也可能是1G。那么内存是如何编地的呢?和地址总线,计算机字长之间又有什么关系呢?内存条容量的大小和它芯片扩展方式有关。比如我们内存模块是采用 16M*8bit的内存颗粒,那么我们使用4个颗粒进行位扩展,成为16M*32bit,使用4个颗粒进行字容量扩展变为64M*32bit。那么我们内存模块使用了16个内存颗粒,实际大小是256MB。

我们需要对这个256M的内存进行编址以便CPU能够使用它,通常我们多种编址方式:

  1. 按字编址:    对于这个256M内存来说,它的寻址范围是64M,而每个内存地址可以存储32bit数据。
  2. 按半字编址:对于这个256M内存来说,它的寻址范围是128M,而每个内存地址可以存储16bit数据。
  3. 按字节编址:对于这个256M内存来说,它的寻址范围是256M,而每个内存地址可以存储8bit数据。

对于我们现在的计算机来说,主要都是采用按字节编址的方式。所以我们可以把内存简单的看成一个线性数组,数组每个元素的大小为8bit,我们称为一个存储单元,对这些存储单元我们从0x00000000开始沿着Rank的访问编址,每8个Cell加1,这样数组里的每个元素都由地址,超过一个Rank的,从上一个Rank的最后一个Cell的地址加1作为基地址。这一点很重要, 这也是为什么对于32位计算机来说,能使用的最多容量的内存为4GB。

三、寻址

当CPU通过地址总线传过来一个物理地址时,内存条是如何寻找到一个Cell的呢。我们首先要看内存条是如何根CPU连接的。

在看看DDR3 128*64bit*16的地址线情况

根据连接情况和组成情况,当物理地址从CPU内部或者是北桥的内存控制器出来时,首先要选择通道,然后是选择DIMM,根据片选到Rank,在到Bank,然后在Chip的地址解码器里输出行地址和列地址,定位到Cell。其实这也就是说物理地址要包含行地址、列地址,bank地址、rank信息等。根据上面的表,物理地址可能的构成如下:

四、读写方式

读取时首先内存控制器将1组位址现传到内存上,控制器跟着传送控制信号;如果是多rank的情况,CS也会送到对应信号选择的目标rank上。接着由于每个rank是由多个chip组成,每个chip仅负责部分的资料读取,chip接收到位址信号后,将位址放入内部的row/column解码器找出对应的bank位址(每家厂商每款产品内部的bank组合可能不同,因此相应地也会略有不同),接着开启row线,同一排row的内部内容就会流到row buffer内部,row buffer判断信号为0或是1之后就输出存储内容。

写入时除了位址资料以外,还会传送欲写入的内容至芯片内部的input buffer,同样的也是按照row/column解码器找出对应位址之后写入。

原文地址:https://www.cnblogs.com/yilang/p/11103061.html

时间: 2024-08-29 23:34:59

内存条的组成、编址、寻址和读写方式的相关文章

驱动开发之 设备读写方式:直接方式

上一节介绍了缓冲区方式读写,这一节咱们来看看直接方式读写设备. 1. 直接方式读写设备,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍.这样,用户模式的缓冲区和内核模式的缓冲区指向的是同一区域的物理内存.无论操作系统如何切换进程,内核模式地址都保持不变. 创建好设备IoCreateDevice后,需要设置DO_DIRECT_IO,  pDevObj->Flags |= DO_DIRECT_IO. 2. 这里涉及到内存描述符表(MDL) MDL结构的声明如下

IO---Java 不同读写方式的IO性能

利用不同的读写方式实现复制时,不同的方法对大文件有较大的影响. 下面就三种方式测试一下. Ps:System.currentMillis();用于记录那一刻的时间. 1.利用单字节的方式直接复制(速度慢) 实现方法如下 public static void dzj(File infile,File outfile) throws IOException{ FileInputStream in =new FileInputStream(infile); FileOutputStream out=n

UE4的JSON读写方式<一>

声明:全部权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/41009343 UE4的Json的解析博客地址: http://blog.csdn.net/cartzhang/article/details/43794409 UE4的Json读写方式<二> UE4 的json读写方式 JSON 的解析有非常多开源库. UE4的JSON使用在代码的Public->Serialization中. 头文件包括:Json.h

文件读写方式

常见C语言的文件读写方式 fopen("*.*","r") fopen("*.*","r+") fopen("*.*","rb") fopen("*.*","rb+") fopen("*.*","w") fopen("*.*","w+") fopen("*.*

UE4的JSON读写方式

UE4 的json读写方式 JSON 的解析有很多开源库.UE4的JSON使用在代码的Public->Serialization中. 头文件包含:Json.h Json的读写创建是static形成的单例模式,有JsonWrite或JsonReader的Factory来创建(Create)出来. 以读方式为例子: 读的代码: float _score = MyPlayerState->GetScore(); FString _player_name = MyPlayerState->Get

驱动开发之 设备读写方式:缓冲区方式

1. 设备对象一共有三种读写方式:缓冲区方式读写(Buffered方式):直接方式读写(Direct方式):Neither方式.这三种方式的Flags分别对应DO_BUFFERED_IO,DO_DIRECT_IO,0 在buffered方式中,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区.而你的驱动程序将使用这个系统缓冲区工作.I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据. 在direct方式中,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL

Windows驱动开发-设备读写方式

设备读写方式共三种: 方式 Flag 特点 缓冲区方式读写 DO_BUFFERED_IO I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区.而你的驱动程序将使用这个系统缓冲区工作.I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据. 直接方式读写 DO_DIRECT_IO I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页.因此你的驱动程序将使用MDL工作. Neither方式 0 I/O管理器仅简单地把用户模式的

java四种文件读写方式及性能比较

测试代码 package com.boot.demo.test.io; import java.io.*; import java.lang.reflect.Method; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOp

自动以读写方式挂载ntfs-黑苹果之路

在mac下ntfs分区总是以只读方式挂载,双操作系统,尤其有些时候需要用u盘,需要手工umount再mount,很麻烦,找了一些资料,通过修改/etc/fstab文件无效,要么就是使用第三方软件,不合要求,无意搜到以下链接: MAC OS X与NTFS 其中通过修改系统的/sbin/mount_ntfs脚本能很好的满足我的需要(10.9下无效),摘录如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 打开终端: sudo