• 4

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

最近電腦記憶體跌到谷底, 4GB RAM 相關的問題又開始浮出來了....
小弟我就以我個人的一些經驗和認知跟各位聊一下關於這個主題 ....

首先要先從電腦的架構開始談起

這邊要特別提的是, 這篇文章的範圍是定義在 x86 個人電腦系統內
感謝網友們提醒, 而黑色字體是我本來寫的, 紅色是有錯誤所以修改的或是特別說明的, 藍色是網友們指正我再額外加上去修改的部份, 大致上是這樣定義的



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

1. 32-bits 系統 VS 64-bits 系統

為什麼我們的電腦系統要分 32-bits 系統和 64-bits 系統呢?
老實說我不清楚為什麼是這兩個數字.
不過我知道的是電腦是透過 0 和 1 這兩種訊號來分辨
你不能奢望說電腦能夠分辨很複雜的資訊, 所以只好讓他用最簡單的方式去判斷
也就是, "有訊號"跟"沒訊號" 這兩種

而電腦系統要怎麼判斷電腦內部所有的資源的所傳送出來的訊號是誰發出來的呢?
只好幫每個裝置弄個地址. 所以呢, 電腦內的 PCI 裝置, 顯示卡 等等 ....只要它會跟 CPU 交換資料的

我們就幫給他一個地址.

而因為電腦只認得 0 和 1, 所以這個地址只好是使用 2 進位.

基於我不記得或不知道的原因, 這個數字被訂成

2 的 32 次方 = 4,294,967,296 Bytes = 4,194,304 Kilo bytes = 4,096 Mega bytes = 4 Giga Bytes

大誤!!!!這邊在寫什麼鬼, 算錯了喔
應該是

2^32 = 4,294,967,296 = 4,194,304 Kilo ??? = 4,096 Mega ??? = 4 Giga ???
其實這邊單位是有點問題的, 照這樣算起來應該還要除以 8 單位才會變成 bytes ( 1 byte = 8 bits )
那變成這樣那怎麼定址到 4 Giga bytes 呢? 那是因為這些定址線定址的單位是 bytes
所以是不需要再除以 8 來計算的
感謝網友指正!!


( 1Giga bytes = 1024 Mega bytes = 1024*1024 Kilo bytes = 1024*1024*1024 Bytes )

時光飛逝, 32-bits 系統漸漸不夠用了, 所以就又出現了 64-bits 系統, 也就是

2 的 64 次方 = 64 Giga bytes
這個部份也錯得很離譜-__- 其實應該是個天文數字


所以這個時候, 我們知道說, 這些數字是拿來當 地址 使用的.

那這些數字要怎麼用來當作地址用呢?

上面這段話也有點問題, 其實定址能力和 CPU 的暫存器長度是沒有一定的關係的
定址線的數量和暫存器的長度是可以不相同的
所以說其實電腦系統是可以擁有超過 4G 的定址能力但是 CPU 還是 32 bits 的喔

而 64 bits 的系統的定址線也不一定有真的作到 64 條喔, 一切都要看硬體設計!!

這裡提到的 CPU 暫存器長度 是指資料線, 而定址能力是指位址線, 這是不同的硬體線路
感謝網友指正!!



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

2. 定址

其實這些數字的使用方法很簡單, 比我們現實生活中的用法簡單多了, 一般現實生活中的地址也許像這樣

台北市內湖區XX路XX巷XX號XX樓

當你看到這樣的一串文字後, 如果你對那個地區有點概念, 你就會開始在腦海中開始從

台北市 然後聯想到 內湖區 那一塊, 接著就是 巷號樓 .....

不過電腦呢, 不用這麼麻煩, 他只是很簡單的把一整個區域的數字分配給某一個裝置而已.

例如各位可以在 裝置管理員 中, 隨意找一個裝置, 例如顯示卡好了.

在該裝置按一下右鍵選內容後, 在最後一個頁籤寫著 資源, 裡面就可以看到這個裝置使用的記憶體範圍

例如 FD000000- FDFFFFFF 之類的範圍, 這就是 BIOS 和裝置溝通後分配給這個裝置的 地址 了.

這是個 16 進位的表示式, 不要把他想的太複雜, 它其實就是在 4 Giga bytes 內的一個範圍就是了

一台電腦內的每個裝置都會分到這樣的一段範圍, 讓 CPU 知道說它在存取的是哪個裝置, 這樣才不會找不到它要得東西

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

3. 早期電腦的定址概觀

基本上, 我們都把這些裝置會使用到的記憶體集中在 3G - 4G 這一段位置中.
理由很簡單, 早期電腦的記憶體很貴, 在當時 32-bits 的機器上面根本不可能擁有這麼大記憶體
想當年我買過一條 8 Mega bytes 的記憶體花了我爸 3000 多大洋 ......
也就是說如果將這些裝置會用到的記憶體設定在 3G - 4G 這個範圍, 就不可能跟真實的記憶體互相搶地址使用
因為你插了多大的記憶體在電腦內, 這些記憶體的空間也需要地址才能被使用的

所以在早期, 你的電腦的地址的分配情況應該是

0 - 電腦主機上所插的記憶體大小 ==> 分配相對應大小的地址給記憶體定址使用
3G - 4G ==> 給電腦主機上面所安裝的裝置定址, 所需大小不定, 不過大部分的裝置使用的大小都不多, 不太可能整體有機會超過 1G

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

4. 現今?

然而, 目前記憶體便宜到一個令人髮指的地步.
所以越來越多的人直接在新電腦上安裝 2G * 2 這樣的記憶體組合
這造成了什麼樣的問題呢??

在上面提到的, 最顯而易見會出現的問題就是, 電腦主機上面的裝置所應該要佔用的記憶體空間
也就是 3G - 4G 這個部份會跟實際記憶體應該佔用的空間重疊到了

這怎麼行?總要有人讓一讓吧, 而這些系統上的裝置當然是一個地址都不可能讓出來
不然你的電腦系統應該也不能正常運作了吧
例如顯示卡的地址如果讓出來, 那顯示卡就不能用啦, 因為 CPU 不知道它在哪
而記憶體已經用掉了 3G 這麼多的"地址"了, 剩下的當然就....只好忘掉它了....
這個部份的分配和在沒有硬體(CPU和晶片組)的支援下, BIOS 會主導其分配
記憶體的地址一定是會被犧牲掉的, 不過這個在後來硬體做了特殊的設計後有了改變.

至於, 為什麼一定要空出 1G(3G-4G) 這麼大的空間給裝置用了, 因為...現在的裝置的確要用掉這麼多...
就這麼簡單, 可以自己去裝置管理員把每個裝置用掉的記憶體加起來你就會知道少說也要用掉 700MB - 800MB 甚至更多

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

5. 硬體支援?

在之前有提到, 新的硬體支援下, 可以完整支援到 4G 的記憶體了. 這是怎麼做到的呢?
這裡還有一個前提, 就是 BIOS 也要有支援, 不過這邊就帶過了
硬體為了因應這個定址空間不夠的問題, 它做了一件事情
既然系統的裝置一定要用 3G-4G, 那麼只好把記憶體要用的地址往上搬了
也就是將原本記憶體應該使用的 3G-4G 空間, 挪到 4G-5G 的位置
也就是增加地址的上限, 讓它還是可以順利給這些本來沒地址的記憶體空間也給了地址用了
這個部份涉及很多硬體上面的技術我也不是很了解了, 不過我們都把這叫做 re-mapping

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

6. 作業系統支援?

既然硬體的部份解決了, 那麼 OS 怎麼辦?

OS 也有分 32-bits 和 64-bits

64-bits OS 就不用說了, 他的產品定位讓它能支援的定址能力絕對是大幅超過 32-bits OS
那麼小小的 4G 當然沒什麼問題

但是 32-bits 就會有問題了, 因為作業系統能夠使用到的記憶體空間上限就是 4G
所以就算你的硬體可以把 3G 以上的記憶體挪到 4G 以上去使用, 但是作業系統沒辦法用到 4G 以上阿
這也就是為什麼就算比較新的 32-bits 作業系統可以知道有 4 Giga bytes的記憶體在系統上
實際上卻還是只能用到 3G 的原因

在這邊網友們說, 其實這樣的觀點是有問題的, 正常支援完整的 OS 是不會有這樣的問題的, 一切都是微軟的陰謀!!!

實際上應該是在硬體的位址線為基準下, OS 應該也要可以定址到相對應的大小才對
而 32-bits 和 64 bits 只是資料線的長度而已, 也就是 CPU 能處理的資料長度


--------------------------------------------------------------------------------------
7. Intel Santarosa or above chipset

在筆記型電腦這一塊, 分水嶺應該是出現在 Intel 的 Santarosa(965) 晶片組問世之後
在這個晶片組之前的 Napa(945) 晶片組是不支援 re-mapping 的
也就是說在 Napa 以前的筆記型電腦是"不可能" 看到並使用超過 3G 的記憶體
就算安裝 64-bits OS 都一樣

但是 Santarosa(965) 以後配合 64-bits OS 就都可以了.

在這一塊一直沒有網友提出來解釋, 我只是照實際上現在的 NB 配合 windows 電腦來解釋
不知道有沒有錯誤, 還煩請各位清楚的人幫忙解釋解釋啦


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

最後, 如果大家有閒看完了這麼一堆東西後, 應該會有一些基本的了解 4G 記憶體的問題了
我並沒有在技術名詞上面做太多的考證, 還請各位高手海涵

最後補充一下, 在國外的論壇上有人做過測試

2003 Server 的 32-bits OS 可以順利使用 4 Giga bytes 的記憶體, 其餘則不行
可能是微軟有對 Server 等級的 OS 做了什麼手腳吧
實際上 2003 Server 這個 OS 有可能不完全是 32 bits OS 也說不定


上面這段話就說明了其實 微軟的 32 bits 的 OS 也可以正常使用 4G 的記憶體
只是它可能基於產品定位的問題特意閹割掉而已


這篇文章其實寫的非常的不嚴謹, 有興趣的人還是要繼續往後面看, 這樣才能看到各位網友對這篇文章的指教與修正喔
2009-01-23 23:53 發佈
文章關鍵字 記憶體 迷思
唉,很多地方講得怪怪的,多到實在無法一一指正。

只能說其實很多32 bits的OS可以超過4G,只是你不知道有而已。

就算只看M$公司的OS,我第一個用到可以超過4G的是WIN2000,大概是五年多前吧,裝了16G在跑,而M$說可以裝到32G呢。至於你說的2003,後來也有用過,可支持援到128G。

這些都是比較高階的版本,也都是真正32 bits的OS。

最重要的是,你提供的算法是錯的。

如果只用2^32來算,這只是bit而已哦,變成只有4Gb,而不是4GB,差了8倍,所以只有512MB而已哦,你能解釋是為什麼嗎?

更別說你連2^64都乘錯了,這是遠大於64G的天文數字哦。
1 32bits 和 64bits
CPU 的 DATA BUS
是指CPU 的運算元可處理的位元數
OS 編譯出來的機器碼需要與CPU 配合
所以32bits OS 編譯出來的機器碼可以給 32bits CPU 用
所以64bits OS 編譯出來的機器碼可以給 64bits CPU 用

至於32bits OS 編譯出來的機器碼可以給 64bits CPU 用
是因為x86 的架構 向下相容
這是ms與intel 的考量
不然那些32bits的應用程式的投資怎麼辦

2 定址
CPU 的 ADDRESS BUS
地址总线的位数决定了CPU可直接寻址的内存空间大小,比如8位微机的地址总线为16位,则其最大可寻址空间为216=64KB,16位微型机的地址总线为20位,其可寻址空间为220=1MB。一般来说,若地址总线为n位,则可寻址空间为2n字节

現在的定址4G 是因為英特爾的32位元CPU的 ADDRESS BUS 只有32條的原因,後來的INTEL CPU 有延伸了一些腳位或什麼之類的
才讓32bits OS 在32bits CPU用間接定址的方式 可以用到4G 以上的記憶體

以前的16位元的DOS 就是這樣玩的 EMS 之類
程式只能小於64k,資料可以到640K,超過的就要用EMS來提取資料了

唉~~年代太久遠了 要回去看一下計算機概論先了 現在才回憶一些些

3. 早期電腦的定址概觀
這是講x86 的架構 才是把IO定址 跟 ADDRESS BUS用在一起

 好像68000其它之類的CPU就有單獨的IO定址線 (看CPU的組合語言有無IO定址的指令就知道了)


電腦(Computer)的架構好像怪怪的<----應該講的是PC吧(IBM當時推出的IBM XT(8088)個人電腦,那時候也有別的計算機叫APPLE(Z80)/APPLEII(65C52)、麥金塔(68000/POWER PC),日本的9801系列(68000))

主題應該是改成

現在的32位元的x86個人電腦在 4G限制的迷思

結論就是 雖然CPU都上64位元了 但是MS 就是不開放低階的OS 使用4G RAM以上 不然它要賺什麼
2^32 = 4,294,967,296 bit
2^64 = 184,467,440,073,709,551,616 bit = (2^32)^2
最主要Server級OS沒有太多雜七雜八的週邊
所以用32bit也能用完整的4GB
不像家用一堆各式各樣的東西而且32位元驅動對超過4GB>會造成系統極不穩定 (雖然Ati的cat 8.12 64bit在Vista64也發生超過4GB就進不了的鳥事)
這裡有詳細的介紹 (英文)
http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx
saqwed wrote:
最近電腦記憶體跌到谷...(恕刪)

題外話:

就要漲價了... 有家 DRAM 工廠己經宣佈破產.
趁漲價前, 趕快去把 RAM 插槽補滿吧.
某家的 正創 報價 2G/800 已經漲 60 了.... (之前己漲 50, 距低點己上漲 110.-)
(sorry, 這裡說的是桌機 RAM 價, 不是 NB RAM 價)
傳統的 IA32 CPU確實只有 32條地址線,
所以定址能力就是 2^32 = 4GB.

後來在INTEL Pentium PRO 擴充到 36條,可以定址 64GB,
但是必須以PAE/PSE-36 方式 以間接定址方式使用.

AMD K8 架構CPU 有40條定址線,所以可以定址到 2^40 GB,
(K8 另有 48 bits 虛擬定址能力)
INTEL 在P4 Prescott 後也擴充到40條定址線,
理論上可以定址 1TB.

但是硬體上沒有I牌A牌 X86 系CPU好像還沒人做滿64條位址線的.
(k10 有 48條定址線 , )



再來是OS問題,
只要OS支援PAE/PSE-36或是新版的PAE/PSE-40,
就可以突破 32bits OS 無法定址 4GB以上的問題.
但是 M$故意在個人用OS上閹割此功能.
(M$的理由是某些情況下會有不穩定的問題)
所以明明在 WINDOWS 2000 adv SERVER OS就可以使用PAE/PSE-36,
在後來的 XP HOME/XP,VISTA 通通不能使用
(據稱 XP SP1 可以,但是目前應該都升到SP2了吧)
實際上,在更古早的 windows nt server ,intel 就撰寫了 PAE driver,
讓windows nt server os 也可以使用超過 4GB 以上的記憶體

LINUX 或其他32 bits OS若採用PAE/PSE-36 定址模式,
也可以突破 4GB 限制,

http://blog.xuite.net/alovs/200/5199575
節錄一段:

Linux Kernel 2.6版支援x86處理器的PAE/PSE-36位元延伸定址模式,可在支援該模式的x86處理器上定址至64GB的主記憶體。


一切都是M$的問題,不是硬體CPU 的問題.
saqwed wrote:
目前記憶體便宜到一個令人髮指的地步.


是你成語用錯了? 還是你故意形容得這樣?

記憶體再便宜也沒必要這麼生氣吧
 
YCL13 wrote:
如果只用2^32來算,這只是bit而已哦,變成只有4Gb,而不是4GB,差了8倍,所以只有512MB而已哦,你能解釋是為什麼嗎?


以 x86 來說,CPU 的 Address 只會定址到 Byte,不會管你要存取第幾個 bit,那是軟體要負責的事。所以原 po 所說的 2^32 = 4GB 是沒有錯的。
Panthera Catus wrote:
是你成語用錯了? 還...(恕刪)


因為早買買貴的人會很生氣
所以令人髮指
得意春風 自在飛翔
  • 4
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?