為什麼RAM少於3G,IO就不用映像到主記憶體?

不好意思請教一下版上的大大
當我們使用32位元作業系統時
IO的位址會被記憶體位址包含
所以插4G只會顯示3.25G左右
可是問題來了
如果插少於3G
系統則會正常顯示記憶體容量
這時IO為什麼不需要映像到主記憶體呢?
觀念不是很清楚,如果有誤煩請指教

PS.印象中有記憶體映像IO跟IO映像IO兩種設計
後者就不會發生記憶體被吃掉的情形
不過會造成設計困難
請問現在瓶頸是卡在這裡嗎?
那64為元OS又是如何做到定址空間變大呢?
不好意思問題比較多.....
2008-05-20 0:40 發佈
這個問題有兩個

1. 主機板的設計的差異,但大部分可以透過更新 BIOS 解決

2. Windows XP本身的問題,XP有一個叫「分頁檔案」的技術,把硬碟部份空間當成 RAM 使用,這些虛擬記憶體也佔用定址,但是關掉分頁檔案,系統一樣不會給你定址4GB記憶體

因此如果使用Linux就可以完整使用4GB

如果使用Winodws,則可以透過RAM Disk的功能,把剩下的記憶體當硬碟,再把分頁檔塞進去即可
似乎沒有回答到我的問題
而且這跟虛擬記憶體、分頁檔沒有關係..........不過還是謝謝你的回答
64位元的LINUX、VISTA我都用過
都可以正常使用到4G以上
|<=========================>| 全部可用位址空間
_____________________|<====>| IO佔用位址空間
|<======================>|__ 實體記憶體佔用位址空間


若 實體記憶體位址空間 + IO佔用位址空間 < 全部可用位址空間
則 可用實體記憶體位址空間 = 實體記憶體位址空間

若 實體記憶體位址空間 + IO佔用位址空間 > 全部可用位址空間
則 可用實體記憶體位址空間 = 全部可用位址空間 - IO佔用位址空間
就這樣囉
32位元作業系統.....
可以有效定址的記憶體空間為4*1024*1024*1024....
也就是4G......
可以把她想成.....
一共有4G個門牌位址.....
而屋子裡住的就是我們存放的資料.....

有些作業系統對IO做存取時.....
是利用讀寫記憶體位址的方式.....
來做存取的動作.....

因此對作業系統而言.....
IO只是比較慢的記憶體.....
所以還是要佔一個門牌.....
也就是說....
IO還是要佔記憶體的位址.....

假設一台電腦....
IO佔的位址要768*1024*1024....
也就是768M....
因此當你插3G的記憶體時......
3G+0.768G並沒有超過4G的定址空間.....
而當你插了4G的記憶體.....
4G+0.768G超過了有效定址空間.....
所以對作業系統而言......
她必須保留768M給IO使用.....
因此記憶體只會顯示3.256G......

需要注意的是......
上面的數字指的都是記憶體位址.....
而不是記憶體容量.......

微軟第網頁上有做一些說明,可以參考看看
http://support.microsoft.com/kb/291988/zh-tw
gogobook88 wrote:
不好意思請教一下版上的大大
當我們使用32位元作業系統時
IO的位址會被記憶體位址包含
所以插4G只會顯示3.25G左右
可是問題來了
如果插少於3G
系統則會正常顯示記憶體容量
這時IO為什麼不需要映像到主記憶體呢?
觀念不是很清楚,如果有誤煩請指教


就我的所知道的來說(有錯請指教)

XP 32bits 這套OS所能控制的所有硬碟裝置只支援32bit 數量

IO定址支援到32bits

其中
主機板
顯示卡記憶體
硬碟裝置
RAID裝置
音效卡
XXX卡
通通都會佔用位址

當你記憶體所佔定址+其他裝置超過XP所能控制的
就會被縮減,只能說MS的設計就這樣 XD

愛機 P-IV 2.4CG and Q6600 MBC:GA-8IPE1000-L and P5K-Pro VGA:MSI-Fx6600鑽石版 and AT
n年前看過一份文章,忘了是施威銘還是侯俊傑或其他人
當時的CPU可定址能力早已破4G的限制

在8088 8086時代,cpu定址是用segment:offset方式(都為16bit)
因此造成了最大的定址空間只有1MB+64KB
在進入386後, cpu定址依舊是用segment:offset方式(已為32bit)
但是在386 protected mode下, segment的功能已和8086不同
它算是一個Descriptor,用來描述這個區段的資訊(包括在實體記憶體中的位址)
而一個Descriptor所能定址的空間範圍就是4G,但是可在實體記憶體中指定位址,不一定是從0開始
若你設成由4G開始,那就可定址到4G~8G的空間

問題來了,當時NT是以flat mode下去規劃Descriptor,也就是說,全部從實體記憶體0x00000000
下去開始定址4G空間,再多的就定址不到

以上是n年前的記憶,不知是否完全正確




jcyao wrote:
n年前看過一份文章,...(恕刪)


Flat 定址是95、98、Windows XP到Vista的作法,其實 Windows2003 版本中,最大的就可以支援 64GB 定址,這是一定會用 selector 的。

不過,這跟所謂硬體映射其實沒有很大的關係。

硬體映射從 8086 就有了,當時的位置是 A000:0000~F000:FFFF這段位置,硬體映射主要是為了可以快速的傳輸資料給介面卡如顯示卡等,讓你寫程式不用透過特殊的 IO port 送給介面卡,直覺也比較快速 (因為記憶體搬移資料有 DMA 機制)

但 x86 的硬體映射因為相容性關係,非得排在高位址不可,到了 Widows 時代,這個設計也還是維持原貌。多工系統下,如果你要切換對介面的呼叫,是會浪費很多記憶體切換的時間,要跳節區,會損失一些效率,所以 win32 程式只能使用 2G (有些系統是 3G) 的原因,就是讓每個程式的高位址 1G 或 2G 作為硬體映射,提高 IO 效率。

Flat 定址下,這種作法也是必然用來作為提高效率的設計。

而這種設計,通常升級的方式就是改成 64 bit 作業系統才能突破 4G 的限制,64 bit 作業系統下,硬體映射會映射到更高的位址去,直到硬體又進步到撐暴他為止。
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?