引用:
作者Devil
linux,mac,windows的kernel小弟我是不清楚
只是聽過的說法為32bit的cpu定址空間只能到4Gb
(不過野口隆史兄提到這個其實是無關的)
小弟我了解的只有sql server
MS官方文件是說windows2003(32bit)開PAE+XEON(p4系列xeon有多4條定址線)+SQL Server(32bit)開AWE可讓SQL Server使用4G以上ram
其實我也挺想知道,目前os不支援4G ram的原因是什麼
以前我一直以為是cpu定址的關係(因為intel的xeon還特別增加4條定址線)
|
來談些有點老梗的問題:
定址其實簡單說就是透過一個Table...內有一堆十六進位值如何和實體記憶體區域怎麼對映的表格,CPU根據這個表格決定他要存取資料位於哪個位址上...因此就叫"定址"
為了增加存取效率...table一般來說都是存在CPU的暫存器上
因此CPU要存取外部記憶體資料時...只要兩個步驟:
1先去暫存器去讀取Table,將需要的記憶體虛擬位址和實體位址做轉換
2.取得實體位址後就可以跟記憶體存取資料
當然2.這個步驟因為是走CPU跟外部記憶體連接的線路...速度當然慢多了
因此暫存器的數量和大小也決定了能夠提供記憶體轉換的對映空間...便影響了能夠定址的記憶體大小了,畢竟CPU的暫存器數量和大小在同種指令集架構下都是固定的
因此如果轉換成x86-64bit的CPU的話...暫存器的大小和數量都會提昇...自然可以很輕鬆的定址更大的空間(當然OS也要對應64bit...)
但是這個table其實也並不是非得要放在暫存器上
如果CPU想存取更大空間的記憶體...但暫存器又不夠的話
就有很多人設計出一堆有的沒的延伸定址的方式
大概不脫離像是二次轉換對應的方式
暫存器內的table將需要延伸定址的區域對應到外部記憶體內的另一個table
但是如果CPU要存取這樣的區域時...會多了一次到外部記憶體存取table的步驟...
結果等於是要存取兩次外部記憶體... 當然這樣效率自然差多了
因此一般還是會保留暫存器內的一部分區域用基本的方式來定址...
但是暫存器內基本定址和延伸定址的比率...是很難決定的....看你是要有存取效能還是能用的記憶體要大

...所以這可能也是為什麼WINXP和2003有一堆記憶體支援能力不同的版本的原因吧
但故且撇開二次存取記憶體對映帶來的延遲...能用的記憶體還是越多越好...
存取記憶體兩次還是遠比用硬碟當虛擬記憶體快多了吧
更何況記憶體要延伸定址多少...主要也只都是簡單調整程式核心就能夠修改的範疇
但是M$卻刻意讓各個版本支援能力不同卻沒讓使用者得以調整
顯然還是商業考量
