[討論] 記憶體的 4GB 迷思?

BDFish wrote:
以 x86 來說,C...(恕刪)


原 po 所說的 2^32 = 4GB 是沒有錯的 +1
一個位址是對應RAM的一個Byte!!
可是我有個疑問...32Bit的CPU是32條 Address bus嗎?
changlee wrote:

原 po 所說的 2^32 = 4GB 是沒有錯的 +1
一個位址是對應RAM的一個Byte!!
可是我有個疑問...32Bit的CPU是32條 Address bus嗎?



上面syntech兄說了~ @@
INTEL的Pentium Pro(32-bit)就已經有36/40-bit Address Line了~
saqwed wrote:
但是 32-bits 就會有問題了, 因為作業系統能夠使用到的記憶體空間上限就是 4G所以就算你的硬體可以把 3G 以上的記憶體挪到 4G 以上去使用, 但是作業系統沒辦法用到 4G 以上阿
這也就是為什麼就算比較新的 32-bits 作業系統可以知道有 4 Giga bytes的記憶體在系統上
實際上卻還是只能用到 3G 的原因
...(恕刪)

給樓主撰文鼓勵一下,不過若不先破除一些最下面所列的常見誤解/迷思,則為文錯誤難免,上面是整篇文章觀念錯得最關鍵的地方,4GB是每一個運行中的32-bit process所被給予的虛擬定址空間上限(包括kernel space),樓主把它跟32-bit作業系統所能夠管理的實體定址空間(可以大於4GB)在觀念上混為一談了。

saqwed wrote:
可能是微軟有對 Server 等級的 OS 做了什麼手腳吧
實際上 2003 Server 這個 OS 有可能不完全是 32 bits OS 也說不定
...(恕刪)

如果只從微軟的消費性XP/ Vista看世界,難免會覺得被封印過的是正常的,表現正常的反而變成被動過手腳的。

changlee wrote:
可是我有個疑問...32Bit的CPU是32條 Address bus嗎?
...(恕刪)

未必,上面syntech大解釋的很清楚。

一些最常見關於32位元處理器/作業系統的誤解一定要先破除,錯誤觀念才不會一傳再傳:

32位元處理器並非一定只能有32條位址線(例:Pentium Pro、Motorola/Freescale PowerPC e500)
32位元處理器並非一定只能有32條資料線(例:Pentium、80386SX、Motorola 68000)
32位元作業系統並非一定只能管理2^32=4GB的實體記憶體/實體定址位址(例:32-bit的Linux、FreeBSD、Solaris、Windows Server 2003/2008 Enterprise...)



ulimie wrote:
題外話:

就要漲價了... 有家 DRAM 工廠己經宣佈破產.
趁漲價前, 趕快去把 RAM 插槽補滿吧.
某家的 正創 報價 2G/800 已經漲 60 了.... (之前己漲 50, 距低點己上漲 110.-)
(sorry, 這裡說的是桌機 RAM 價, 不是 NB RAM 價)


容我這個外行人問個問題!
如果4GB的ram都有問題的話
把一般的主機板插滿4條賣的最好的2GB DDR2
那不是問題更大
eoskiss wrote:
容我這個外行人問個問...(恕刪)

呃.....我也算是外行人.

不過, 我週邊的朋友, 弄個 6G/8G, 或是跑 X32/X64 的, 而且玩各式各樣 OS 玩的很精的大有人在, 我的東西都是他們幫我調校的.

所以, 我說我說的是題外話... 不要介意. OK, 算我多嘴.

畢竟我也只有一台 PC 是裝了 5G, 另一台 NB 裝了 4G, 如此而己. 而碰到的問題, 只有一個: 就是 NB 在休眠會有問題(因為拔掉多加的 2G 就 OK 了.); 其他的都還好.
BDFish wrote:
以 x86 來說,CPU 的 Address 只會定址到 Byte,不會管你要存取第幾個 bit,那是軟體要負責的事。所以原 po 所說的 2^32 = 4GB 是沒有錯的。


其實您已經算講出來了,也有很多人都講出來了。

其本上,這兩個根本是不算相關的東西,OS的32 bits和系統硬體在作記憶體定址時有幾隻腳,根本沒有絕對關係,就算是32 bits的OS,也可以透過某些方式去使用超過32隻腳來定址。

所以我才會那麼問,因為已經有太多人把這兩個混在一起了,每次這個問題出來,就會有不懂的人裝懂地說這是因為32 bits,而2^32=4G,所以最多4G,這根本是完全錯誤的說法。

這樣還能說原PO是沒錯嗎?
原po把OS想的太簡單了

OS里memory management這部分不是白做的
老實說, 今天一回家, 就有被鞭的很慘的預感...

沒想到大家都很認真的回應並幫我糾正錯誤, 超感動!!!!

-----------------------------------------------------------------------

好吧, 我想提幾個地方請教各位來修正一下文章, 因為我真的不是很懂....


先感謝 YCL13 網友告訴我我的計算能力實在很有問題, 更可怕的是我居然完全沒發現 -__-

所以我往下又看到 BDFish 網友說明了為什麼 2^32 答案還是 4G bytes

答案是因為一條線可以定址 1 bytes 這樣子(其實不是真的 1 bytes, 而是這 8 個 bits 會由軟體方式去存取)

這個部份是否正確呢??

-----------------------------------------------------------------------

另外, 經過了幾位網友很小力的鞭了我一下(感恩!), 我突然想起

CPU 是 32 bits 並不代表著定址能力也只能是 32 bits 這件事

所以其實我在這邊犯了一個很大的錯誤, 所以在看到 syntech 網友說到

INTEL Pentium PRO 定址能力增加到 36 bits 我就知道後面一定會被鞭><

-----------------------------------------------------------------------

感謝各位很認真的提供一些意見使我的觀念往正確又進了一步!!!



-----------------------------------------------------------------------

另外後面幾位網友開玩笑說到為什麼我用令人髮指這個成語.....
的確是被猜對了.... 因為我有被貴到....-___-
補充一下軟體對記憶體定址的方法
32bit定址到4G跟能定址到4G是兩碼子事
32bit能定址到4G沒錯,因為32bit最多只能表示到4G大的數字
而記憶體並不是編號好的空間
所以說"只"能定址到4G相當於將這個空間視為每一個Byte都被編號好了的
這就好像:例如1~5是2G,6~0又2G這樣共4G
[1,2,3,4,5],[6,7,8,9,0],[........],[........]
如果每一個Byte都被(起始編號)1~0(結尾編號)編號好了那確實沒有夠大的數字能表示0以後的空間了
但如果我們把每一個空間開始的位置用一個指向空間來表示(指過去)
[go to A,go to B,3,4,5],[6,7,8,9,0],[A........],[B........]
這樣他就能突破所有限制了,因為他的每一頁都有4G
而第1頁的2G內能表示幾頁呢..........一個32bit就能表示(指向)一頁了
但這樣作法的前題是:BIOS要能抓到所有的記憶體

ps.
本來應該用C語言中的指標int *p與長指標int **pp來解釋但可能會講得更灰XD
小弟純粹以程式設計觀點解釋如有錯誤請不吝指教
2003我確定可以抓到8G記憶體
因為我已經用過一段時間了
至於說1BYTE
那個.....耶
樓主是不是要把資料線和位址線弄清楚再來說...
不過請以X86架構來說XD
如果假設是ARM架構那又不一樣了XD
這個嘛...交給樓下的(丟棒子)(炸)
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!