我們先從一道簡單的問題說起!
設有一個1MB容量的存儲器,字長32位,問:按字節編址,字編址的尋址范圍以及各自的尋址范圍大小?
如果按字節編址,則
1MB = 2^20B
1字節=1B=8bit
2^20B/1B = 2^20
地址范圍為0~(2^20)-1,也就是說需要二十根地址線才能完成對1MB空間的編碼,所以地址寄存器為20位,尋址范圍大小為2^20=1M
如果按字編址,則
1MB=2^20B
1字=32bit=4B
2^20B/4B = 2^18
地址范圍為0~2^18-1,也就是說我們至少要用18根地址線才能完成對1MB空間的編碼。因此按字編址的尋址范圍是2^18
以上題目注意幾點:
1.區分尋址空間與尋址范圍兩個不同的概念,尋址范圍僅僅是一個數字范圍,不帶有單位
而尋址范圍的大小很明顯是一個數,指尋址區間的大小
而尋址空間指能夠尋址最大容量,單位一般用MB、B來表示;本題中尋址范圍為0~(2^20)-1,尋址空間為1MB。
2.按字節尋址,指的是存儲空間的最小編址單位是字節,按字編址,是指存儲空間的最小編址單位是字,以上題為例,總的存儲器容量是一定的,按字編址和按字節編址所需要的編碼數量是不同的,按字編址由於編址單位比較大(1字=32bit=4B),從而編碼較少,而按字節編址由於編碼單位較小(1字節=1B=8bit),從而編碼較多。
3.區別M和MB。
M為數量單位。1024=1K,1024K=1M
MB指容量大小。1024B=1KB,1024KB=1MB.
轉自 http://blog.csdn.net/lishuhuakai/article/details/8934540
2. 內存編址
前面我們知道了DRAM顆粒以及內存模塊是如何擴展字長和容量的。一個內存可能是8位,也可能是64位,容量可能是1M,也可能是1G。那么內存是如何編地的呢?和地址總線,計算機字長之間又有什么關系呢?
2.1 字長
計算機在同一時間內處理的一組二進制數稱為一個計算機的“字”,而這組二進制數的位數就是“字長”。。通常稱處理字長為8位數據的CPU叫8位CPU,32位CPU就是在同一時間內處理字長為32位的二進制數據。 所以這里的字並不是我們理解的雙字節(Word)而是和硬件相關的一個概念。一般來說計算機的數據線的位數和字長是相同的。這樣從內存獲取數據后,只需要一次就能把數據全部傳送給CPU。
2.2 地址總線
前面我們已經介紹過地址總線的功能。地址總線的數量決定了他最大的尋址范圍。就目前來說一般地址總線先字長相同。比如32位計算機擁有32為數據線和32為地線,最大尋址范圍是4G(0x00000000 ~ 0xFFFFFFFF)。當然也有例外,Intel的8086是16為字長的CPU,采用了16位數據線和20位數據線。
2.3 內存編址
從前面我們知道一個內存的大小和它芯片擴展方式有關。比如我們內存模塊是采用 16M*8bit的內存顆粒,那么我們使用4個顆粒進行位擴展,成為16M*32bit,使用4個顆粒進行字容量擴展變為64M*32bit。那么我們內存模塊使用了16個內存顆粒,實際大小是256MB。
我們需要對這個256M的內存進行編址以便CPU能夠使用它,通常我們多種編址方式:
- 按字編址: 對於這個256M內存來說,它的尋址范圍是64M,而每個內存地址可以存儲32bit數據。
- 按半字編址:對於這個256M內存來說,它的尋址范圍是128M,而每個內存地址可以存儲16bit數據。
- 按字節編址:對於這個256M內存來說,它的尋址范圍是256M,而每個內存地址可以存儲8bit數據。
對於我們現在的計算機來說,主要都是采用按字節編址的方式。所以我們可以把內存簡單的看成一個線性數組,數組每個元素的大小為8bit,我們稱為一個存儲單元。這一點很重要,因為后面討論的所有問題內存都是以按字節編址的方式。 這也是為什么對於32位計算機來說,能使用的最多容量的內存為4GB。如果我們按字編地址,能使用的最大內存容量就是16GB了。
於是很容易想到一個問題,為什么我們要采用字節編址的方式呢?關於這個問題,我在網上基本沒有找到答案,甚至都找不到問這個問題的。所以這里沒法給出答案,為什么為什么呢? 麻煩知道的朋友告訴我哈。
另一方面的問題是,內存編址方式和DRAM芯片是否有關呢? 我認為還是有一定關系。比如我DRAM的芯片是8M*8bit,那么芯片最小的存儲單位就是8bit,那么我們內存編址就不能按照半個字節來編址。否則內存取出8bit,根本不知道你要那4bit傳給CPU。也有一種說法是現在的DRAM芯片cell都是8bit,所以采用按字節編址。另一方面應該也和數據總線位寬有關。