Memory中的Channel/Rank/Bank解析
最近在看網卡底層驅動的一些資料,被內存bank
,rank
,channel
這些關於memory
的名詞搞得繞來繞去,網上查了一些資料,說得也不全面。在這裏讓我們一步一步來拆解memory
的神祕面紗,從架構到讀寫逐步解開這塊祕密。
發揮性memory
分兩種,SRAM
與DRAM
RAM(Random Access Memory)
隨機存取內存,之所以叫做“隨機存取”,是因爲相對於早期現行存儲媒介(磁帶?很久以前的)而言,因爲磁帶的存取是線性的(還記得快進/倒帶 那個滋溜爽),存取時間由目前磁帶位置和目的位置的距離而定(類似數據結構中的線性表)。需要轉動刺頭到應有的位置,因此距離越長,轉的就越久了,讀寫時間也越久。而偉大的RAM
沒有這種限制,存取時間爲固定值(類似數組這種下表式訪問,下標就是地址),不會因爲存儲資料在memory
中的位置而影響讀取時間。
RAM
大致可以分爲兩種:SRAM
與DRAM
,這兩者基本原理上有相同的地方,都是將電荷存儲到記憶體內部,由此針對不同的電荷存儲0 or 1. SRAM(Static Random Access Memory)
靜態隨機存儲memory和DRAM(Dynamic Random Access Memory)
有幾點不同:SRAM
的結構比較複雜,單位面積的容量少,存取速度很快;DRAM
則結構簡單,單位面積存儲的容量比較多,存取時間相對SRAM
慢,同時DRAM
因爲構造比較簡單,存儲的電荷惠隨着時間逐漸消失,因此需要定時再充電(Refresh
),以保持電容存儲的資料。
由圖中的SRAM
和DRAM
構造可以知道,SRAM
採用正反三極管+電容(flip-flop
)構造存儲器,DRAM
則是採用電容式存儲(md,這兩圖看着好熟悉,就是看不懂早忘了,欲哭無淚)。因爲SRAM
和DRAM
的種種特性上的不同,SRAM
比較適合作爲暫存器,配合CPU快速存取使用。DRAM
則適合作爲主要的memory記憶體而使用。
易失性存儲器與非易失性存儲器
易失性存儲器/記憶體(Volatile Memory
)和非易失性存儲器/記憶體(Non-Volatile Memory
)之間的差異在於,斷電之後是否還可以保存內部存儲的資料。揮發性記憶體的資料將會隨着失去電力的供應而消失,而非揮發性記憶體依然可以保存有內部的資料。
內存子系統
DRAM
由於構造簡單,高密度,作爲電腦內部的主要記憶體非常適合。但由於主存通常放在CPU
之外,從工廠出來的顆粒需要封裝和組合之後纔可以和CPU
相連,因此從CPU
到DRAM
顆粒之間依次按層級由大到小分爲channel > DIMM > rank > chip > bank > row/column
。(和lz之前想的差不多,就跟先到哪條街道,哪個小區單元,哪個棟樓,幾層幾單元的地址格局一樣)。下面,讓我們來一一說明這些部分:
內存的結構(從上往下,由大到小)
內存從channel到chip的對應關係。這裏特別要注意,rank和內存條的面沒有必然關係,雖然圖中這麼畫了,但是不要誤導大家,就是示意一下,下面會有詳細介紹。
chip 再往下拆分爲 bank
bank 再往下拆分就是一個個的存儲單位,橫排爲row
,縱列爲column
,每排column
的下方都有一個row buffer
,用來暫存剛剛讀取出來的某個row
排的資料。(是不是很簡單,是不是很像你家小區的格局?Yeah!so easy ~)
Bank 再往下拆分
單個DRAM顆粒內部的功能區塊圖(圖片來自Micron)
channel
和 DIMM
從內存控制器出來之後,最先到達的是channel
,每個channel
都需要配有一組內存控制器,2個channel
兩個……以此類推。而每個channel
中能夠有很多組DIMM(Dual In-line Memory Module)
,DIMM
就是目前能夠在消費市場上買到的大家平時能看到的內存模組。因爲n多年前的主板必須購買內存顆粒(chip)自己插在主板上(想想知道爲啥那時候大師都厲害了吧,這組成原理在實踐中就得到了鍛鍊),然後發展出SIMM (Single In-line Memory Module)
,將多組內存顆粒(chip
)焊在一塊電路板上,成爲內存模組,再將次電路板插在主板上。接着爲了增加吞吐量,將一條內存模組的位寬從SIMM
的32bit升級到DIMM
的64bit,這個設計沿用至今。
從內存顆粒過度到SIMM
的時代,坊間曾出現替使用者將內存顆粒焊接到SIMM
電路板上的私活,因爲當時的內存條非常貴,所以稍微花點小錢就可以把內存顆粒換到新的電腦上。
rank
和chip
rank
指的是連接到同一個cs(Chip Select,片選)
的所有內存顆粒chips,內存控制器能夠對同一個rank
的所有chips同時進行讀寫操作,而在同一個rank
的chip
也分享同樣的控制信號。以目前的電腦來說,因爲一組channel的位寬是64bit,所以能夠同時讀寫8byte的資料,如果是具有ECC
功能的內存控制器和ECC
內存模組,那麼一組channel的位寬就是72bit。
rank
rank1和rank2共享同一組addr/command
信號線,利用cs片選線選擇欲讀取或是寫入的那一組,之後將存儲內容經由MUX
多路器送出。
很多人有錯誤的理解,常以chip
的數量或是以內存模組的單/雙面對rank
進行判斷,但實際上應該以內存控制器和內存顆粒的規格進行判斷。目前家用PC的內存控制器通道絕大部分是64bit寬,內存顆粒的位寬是8bit。因此8顆顆粒就可以滿足內存控制器的需求,也就是一組rank
。但偶爾也有以16bit位寬的內存顆粒製成的內存模組,此時4個顆粒chip就是一組rank
。
這在採用Intel H61/H81 芯片組 和 傳統單channel的主板時需要特別注意,因爲Intel限制H64/H81每個channel僅能支持2組rank
,而不是4組rank
,部分主板每個channel又做了2組內存模組插槽,造成部分使用者同組channel放入2條內存模組(內存條)時能夠識別全部的內存容量(對於雙面單rank
的內存模組是這樣),然而部分使用者則僅能識別一半的容量(雙面雙rank
的內存模組)。
bank
,row
,column
bank
再往下分就是實際存儲單位元的電路,一般來說橫向選擇排數的線路稱爲row(row enable, row select, word line)
,縱向負責傳送信號的線路稱爲column(bitline)
,每組bank
的下方還會有個row buffer(sense amplifer)
,負責將讀出的row
內容暫存,等待column
位址送到後輸出正確的位元,以及判斷存儲的內容是0還是1.
一個bank的讀取操作。
一個bank的寫入操作。
內存的讀寫方式
上圖標明瞭內存的讀寫方式,讀取時首先內存控制器將1組位址現傳到內存上,控制器跟着傳送控制信號;如果是多rank
的情況,CS
也會送到對應信號選擇的目標rank
上。接着由於每個rank
是由多個chip
組成,每個chip
僅負責部分的資料讀取,chip
接收到位址信號後,將位址放入內部的row/column
解碼器找出對應的bank
位址(每家廠商每款產品內部的bank
組合可能不同,因此相應地也會略有不同),接着開啓row
線,同一排row
的內部內容就會流到row buffer
內部,row buffer
判斷信號爲0或是1之後就輸出存儲內容。
寫入時除了位址資料以外,還會傳送欲寫入的內容至芯片內部的input buffer
,同樣的也是按照row/column
解碼器找出對應位址之後寫入。
內存控制器和DIMM之間的線路關係
記憶控制器和DIMM之間的線路關係
越多越好,加速讀寫能力
家用電腦的內存控制器已經進入雙通道內存控制器多年,加速原理爲增加位寬,達到同時讀寫更多資料的能力。
另一種增加頻寬的方法就是減少延遲,利用多個chip
或是bank
達成。一般的內存讀取延遲爲 命令下達 + 內存讀取延遲 + 輸出內容,如果命令下達延遲爲2ns,內存讀取延遲爲10ns,輸出內容延遲爲2ns,那麼讀取兩筆資料的延遲就是 (2+10+2) × 2 = 28ns。
如果能夠將資料拆分到2顆內存顆粒上,那麼這兩筆讀取延遲將降低至2+2+10+2=16ns,因爲不需要等到前面一筆資料的讀取完成才發出下一筆的讀取命令,在第一筆資料進入內存讀取時就可發出。這種概念也可應用到目前的SSD上,較多的ce
分裝的快速記憶芯片,通常都比較少ce
封裝的芯片來得快。
由時序圖可以知道,下凡此種儘量拆分內存空間的作法,可以大幅減少延遲。