2017-04-06 99 views
1

我讀有關的字大小,它規定如下:字大小限制內存地址的數量,而不是內存本身?

每臺計算機都有一個字的大小,表示 指針數據的標稱尺寸。由於虛擬地址是由這樣一個字編碼的,因此由字大小確定的最重要的系統參數是虛擬地址空間的最大大小。也就是說,對於具有w位字大小的機器,虛擬地址的範圍可以從0到2^w-1

32位字大小將虛擬地址空間限制爲4千兆字節,即: ,超過4×10^9個字節。

我的理解是正確的,它是可能的地址數量,而不是總的內存大小?例如,如果一個單詞是2位,那麼我有4個地址(2^2),但是,放置在這些地址中的內容可能具有更大的尺寸。我可以訪問總共1GB的struct,並將其置於address[0]之下,以便即使地址限制爲2位,內存也會超過1GB。

+0

指針可以以任何方式自由表示,但它們通常是字節偏移量,所以限制了內存本身。 – Ryan

+0

@ Ap31,它是[這本書](https://www.amazon.com/Computer-Systems-Programmers-Perspective-3rd/dp/013409266X/ref=sr_1_1?ie=UTF8&qid=1491458225&sr=8-1&keywords=computer+系統+ a +程序員%27s +透視圖) –

回答

3

計算機內部有地址總線和數據總線。地址總線和數據總線不是同一個總線 - 例如,你可以有一個16位地址總線和一個32位數據總線。如果是字尋址機器,則可能的地址數爲65536,總內存大小爲262144字節(65536字,= 65536 * 4),如果是字節尋址機,則總內存大小爲65536字節。

這些天大部分的CPU都是字節尋址的,一些舊的大型機和超級計算機(例如老Crays)都是字處理的。在尋址機器上,無論如何都沒有真正的「字節」概念,所以內存大小是用文字引用的。

實際上,該字節已成爲可用的最小內存單元,不要太小,不要太大。例如,一個位尋址的機器對於相同大小的存儲器需要8倍的存儲器總線(非常不方便),並且64位字會使大量通用計算浪費。

一切都是字真的尋址

具有諷刺意味的是,高速緩存和DDR內存的設計意味着,當你的程序解決了單字節,數據的整個高速緩存行的身價從DDR在加載數據總線。 DDR4的數據總線是64位寬,所以當你的程序訪問一個字節時至少加載64位。所以你的程序「認爲」它生活在一個字節尋址的環境中,但是存儲器接口的物理現實是它是64位字尋址的。

+0

謝謝,所以基本上我的理解是正確的? –

+0

@Maximus嗯,這取決於。我們認爲現代英特爾X64s是「64位」計算機,您的程序將使用64位指針,整數可以是64位寬。但物理地址總線不是64位(48位?),並且有多於1個存儲器控制器,所以有3或4條64位數據總線等等。它很複雜。您的軟件將所有內容視爲64位虛擬地址和字節尋址,但最大內存大小受物理地址總線,數據總線寬度和控制器數量的限制。然而,當我們說「64位」時,這就是所謂的「虛擬」尺寸。 – bazza

+0

@Maximus例如,DDR4 SIMM的最大容量爲512GiB,並且由於它具有64位數據總線,因此只需要2^34位不同的地址就可以訪問所有這些。所以它需要一個34位地址總線。然而,DDR4尋址是在「行」和「銀行」中完成的,因此甚至沒有地址總線。 – bazza

2

你的書不是完全真實的,但作爲一般的簡單規則,它保持得很好。

今天常見的例外情況是,你可以使用大於地址範圍的字大小,比如大多數64位CPU(我知道足夠的詳細信息來了解地址範圍) - x86-64例如,有一個48位的虛擬地址範圍,技術上可以擴展到53位我相信。要做得更好,需要在機器中進行新的頁面佈局設計,所以不是微不足道的改變。 48個有效位之外的地址(實際上是47位,然後是第48位頂部(或符號)位擴展到剩餘的16位,確保沒有人使用最高16位用於導致中斷的「巧妙的東西」體系結構是否/何時擴展地址範圍)。AArch64(ARM的64位處理器架構)也只使用64位的一部分用於虛擬地址 - 我認爲它也是48位。另一方面,25年前,當16位x86計算機是標準的時候,由於段寄存器被移位了4位然後被添加到一個「字」中,它們可以處理多於16位的「字」 16位寄存器值,這允許20位地址範圍[1] - 或者在保護模式下的80286處理器中,段寄存器包含索引到段描述符表中,該描述符表具有一個基址,它被添加到常規寄存器值,總共給出24位地址。

當然,許多處理器的物理地址範圍比虛擬地址的限制更嚴格,因爲將引腳用於尋址內存到處理器外部是「昂貴的」。 68000是32位處理器,但只有24個地址引腳。早期的x86-64處理器只有40位地址引腳,提供64GB的內存範圍。

[1]實際上稍微有點過了,因爲你可以得到一個20位值的加法,低四位零加到16位值上。

+0

謝謝你的回答 –