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

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

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

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 作業系統下,硬體映射會映射到更高的位址去,直到硬體又進步到撐暴他為止。
文章分享
評分
評分
複製連結

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