一、組成
這是一個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同時進行讀寫操作,而在同一個rank
的chip
也分享同樣的控制信號。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能夠使用它,通常我們多種編址方式:
- 按字編址: 對於這個256M內存來說,它的尋址范圍是64M,而每個內存地址可以存儲32bit數據。
- 按半字編址:對於這個256M內存來說,它的尋址范圍是128M,而每個內存地址可以存儲16bit數據。
- 按字節編址:對於這個256M內存來說,它的尋址范圍是256M,而每個內存地址可以存儲8bit數據。
對於我們現在的計算機來說,主要都是采用按字節編址的方式。所以我們可以把內存簡單的看成一個線性數組,數組每個元素的大小為8bit,我們稱為一個存儲單元,對這些存儲單元我們從0x00000000開始沿着Rank的訪問編址,每8個Cell加1,這樣數組里的每個元素都由地址,超過一個Rank的,從上一個Rank的最后一個Cell的地址加1作為基地址。這一點很重要, 這也是為什么對於32位計算機來說,能使用的最多容量的內存為4GB。
三、尋址
當CPU通過地址總線傳過來一個物理地址時,內存條是如何尋找到一個Cell的呢。我們首先要看內存條是如何根CPU連接的。
在看看DDR3 128*64bit*16的地址線情況
根據連接情況和組成情況,當物理地址從MMU單元出來時,CPU會把需要訪問的地址當做一個數據給內存控制器,如果不是集成在CPU內部,那么通過DMI總線(CPU鏈接北橋的總線)傳送給北橋,當然這個是會加上一些標識以方便北橋識別,這個數據是需要訪問的內存地址, 當北橋(內存控制器)收到這個地址后,通過集成在控制器中的"邏輯映射", 內存控制器就知道這個地址對應了了那個rank(p-bank),那個L-bank,L-bank中的那個row地址,L-bank中的那個Column地址,及確定了那個CS#信號有效(選擇rank),那組bank#信號有效(選擇L-bank), 然后北橋在遵從SPD設定的內存的時序下按照固定的時序發送CS#信號 bank#信號 row address column address 特殊狀態下還會有DQM信號 BL信號等等。也就是說從內存控制器出來,然后是選擇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
解碼器找出對應位址之后寫入。