单根内存条的极限容量是多少?内存条上的2R X 8代表了什么意思?
1 物理内存条
我们平时看到内存条,有的上面单面有8个内存颗粒:
上图就是1R X 8 DIMM
有的则有16个内存颗粒:
上图就是2R X 4 DIMM;多出来几个颗粒是ECC校验用
甚至还有单面32个颗粒的超高怪物:
上图就是4R X 4 DIMM.
另一篇文章讨论了服务器能够支持的内存最大容量.
得出了结论:最大内存是由能够插多少条内存决定的,因为每根内存条现在最大128GB(傲腾内存已经超过512GB了),整体内存容量就被限制了下来,这不是钱多钱少的问题。
是不是可以通过不停增加颗粒数目来堆出超高内存容量的内存条呢?答案当然是否定的了。今天我们就一起来探讨一下问什么。
首先我们假定不考虑内存颗粒能不能做出这么大的容量,仅仅理论探讨。限于篇幅,为了简化讨论范围,我们给问题设置了一些限制:
-
仅讨论DDR4,包括UDIMM DDR4和RDIMM DDR4。DDR3因为本身支持的容量就小而且基本已被淘汰,我们就不必哀悼它了。DDR5目前还没有上市,我们等它成熟后再来重新回顾它的理论极限。LRDIMM会有些许顾及,担不是重点。
-
讨论基于DDR内存的标准:JEDEC标准。
内存条的容量和它的基本单位:内存颗粒的组织方式息息相关。如果我们仔细看上面那三种内存条和注解,你能不能发现一些规律呢?细心的同学也许发现了:
- 越大的内存容量,nR中的n就越大;
- 与此相反,越大的内存容量,X n中的n反而越小。
这是为什么呢?我们需要从DRAM的原理讲起。
2 DRAM原理
内存DRAM的每个单元可以看作一个晶体管和一个电容的组合:
电容负责存储,充过电时是1,没充过电是0,这就是内存是如何存储数据的。
晶体管是个开关,用于选中该电容。Word line被选中,晶体管导通,电容的就和bit line导通,可以读出0和1。正是因为内存每个单元如此简单,才能如此大规模组织起来,形成低价而密度很高的内存颗粒。
这种方式设计简单,但是在充放电时电压和电荷管理有很多麻烦。所以引入了Sense Amplifier。单元就变成了这样:
单元还是只有一个电容和一个晶体管。但Sense Amp就复杂了不少:
Sense Amp一般由6个以上的晶体管组成。比较昂贵,但是因为整个bank只有一组Sense Amplifier,所以问题不大,而且好处不少。
好了,有了单个单元,我们来组成一个内存组试试:
上图中绿色箭头是Sense Amp
看起来简单而优美,一个word line,选中后所有16单元都被Sense Amp缓存,漂亮!慢着,似乎那里不对?是的,这样效率太低,原来1个单元有1个晶体管和一个电容组成,现在平均变成了7个晶体管和1个电容,这和DRAM的低成本设计目标是违背的,必须减少Sense Amp的个数。有没有更好的解决办法呢?
这样好多了,还是16个存贮单元,但是仅仅用了4个sense amp,代价是word line从一个变成了4个。这是减低成本必须付出的代价。现在我们推广成更大的形式:
bank里的每个row共享一个word line,行**ACT后,该row上的word line高电平,row上的存储内容会被该bank的Sense Amplifier缓存。这个内存单元有32个行地址(row address),32个列,5个列地址(column address)。地址线太多,有没有办法减低呢?如果一次列选中能够送出多个内容就好了:
上图属于: X 4 内存array,32 Bit位宽
这样同样寻址这些单元,但列地址从5个,减小成3个。太棒了!
我们知道,X86的cache line是64 Bytes,它会一次向内存控制器请求整个cache line。内存控制器发现他们是连续的地址后,会用一次用burst方式读取8个字长,每字长是64个bits。64个bits是内存控制器读取的最小单位。这非常重要,为了完成必要条件,我们必须继续扩展内存单元:
上图是: X 4 内存array,64Bit位宽
我们数一下,共有16个column,4个column address。继续扩张成DDR4标准的4个bank就变成了:
上图是: X 4 内存array,64Bit位宽,4个bank
至于什么是bank,可以见我的这几篇入门文章:
这就是现代内存组成的原理。
好了,我们可以回过头来看看: nR X m是啥意思了。
1.R是Rank的缩写,n是多少有个Rank。每个Rank有自己的片选信号:CS。各个rank单独工作,JEDEC标准DDR4可以取1,2,4个rank。
2.X m中的m就是前面讲的每个列的位宽,X4就是每列输出4个bit,X8就是每列输出8个bit。JEDEC标准只有4,8,16,三个选项。
明显的rank越多,用同种内存颗粒,可以做出的内存条容量就大。那么是不是内存颗粒X m,m越大,内存就大呢?恰恰相反,同样容量的内存颗粒,m越小,就可以用更多的内存颗粒拼起来,组成大内存。我们看个例子:
同样4Gb(注意这里是小b)的内存颗粒,为了组成64 Bit的位宽,我们可以用16个X 4颗粒,那么总容量是:
4 Gb X (64/4)= 64 Gb = 8GB
而用X 16的颗粒呢?只能用4个:
4 Gb X (64/16)= 16Gb = 2GB
那么单内存颗粒是不是容量就可以无穷大呢?并不是。
3 内存颗粒容量限制
内存颗粒并不能无限变大,因为没有那么多地址线。尽管从DDR开始,JEDEC标准就不停的增加地址线,但到了DDR4,地址还是有限的,这也是DDR5必须尽早出来的原因之一。地址线的多少决定了可以寻址多大空间,也决定了单颗内存容量的上限。
我们来看看DDR4对地址线的定义:
-
行地址:A0\~A17共18根
-
列地址:A0\~A9
-
Bank Addr:BA0,BA1两个
-
Bank Group: BG0,BG1两个
好了,我们可以来算算颗粒的容量了,如果我们用X4的颗粒
(2^18) X (2^10) X (2^2) X (2^2) X 4 = 16Gb
我们来算一下DIMM的容量:
16 Gb X 16个 X 4个rank = 128GB
这就是单根内存条的理论最大容量。
4 结论
单根UDIMM/RDIMM的容量最大128GB,这是JEDEC的标准所允许的最大容量。LRDIMM可以达到更大容量,它的原理我们今后再讲。
另外我们看到,如果选用X16的颗粒,单颗颗粒可以容量更大,但是总容量受只能用4个颗粒的限制,还是不能超过64GB。而同样容量的内存颗粒,因为单元数目相同,成本差别不大,为了组成更大内存,内存条厂商往往选择x 4的来组成大容量内存。这也就为什么超大容量内存条总是X 4的原因。
5 参考
- 本文章参考: 微信公众账号UEFIBlog, 点此进入文章
- 内存系列一:快速读懂内存条标签
- 内存系列二:深入理解硬件原理