瀏覽單個文章
RogerShih
*停權中*
 
RogerShih的大頭照
 

加入日期: Nov 2000
您的住址: Taipei,ROC
文章: 573
引用:
作者ProtoZohar
不知道能不能請教RogerShih兄可能是很基本的問題 :那就是吃掉定址與記憶體的差異在哪啊?

另外是否可以稍微請RogerShih兄分析一下硬體映射區的前後差異、彼此間有怎樣的影響等等

以及是否可以針對「為了簡化系統中運作所有執行的程式有一個一致而簡單的設計」這點稍微講解一下?

希望可以多學一點,懇請RogerShih兄能解惑一下


1. 如果你經歷過 DOS 時代,應該知道有些顯卡有段區域,一般是 A000:000 或 B000:0000 這兩段區域,當時很多顯卡記憶體可以超過 64K ,但你要存取顯示卡上的記憶體,如果用 IO 指令一般來說太慢,也太麻煩,所以通常是將資料寫入這之中一塊區域,將資料寫入顯卡裡。

這樣不但方便程式直接以 segment : offset 定址去存取介面卡硬體資料,透過 DMA 等硬體機制,效能也更好。

不過因為當年是真實模式,程式的定址其實就等於真實定址,你要將定址跟真正存放資料的地方分開是不太可能的,不過也還是有一些軟體可以作到,如 QEMM 就可以把 640K 外能用的空間放出來用。

保護模式下,定址不像 8088、286 真實模式那樣直接,而改以 GDT 、LDT等表格法來定址,32位元 CPU 下這些表格多達8000~16000多個,每個表格都可以定址 4GB。但這裡的定址其實是虛擬定址,還得透過一個換算機制轉成真正的實際位址。

這中間,有很多技巧,可以讓硬體佔用的實際定址讓使用者看不到,或者映射到其他地方,甚至於讓資料暫存到硬碟去,其實,虛擬記憶體管理做的,簡單說來也就這麼回事。

之所以要讓硬體佔用4GB內的定址,其中最主要的原因,就是為了效能。

以前 windows NT 效能遠比 window98 XP 差,主要原因除了他的各種保護機制比較多,他的記憶體定址管理設計,跟 XP 是不太一樣的,NT 定址能力遠比 98 XP 等要來的完整許多,但效能也比較不如XP,這也是原因之一。如以 Intel 當初設計 386 的理念來看,Windows NT 比較符合,而不是 XP。




2. 簡化是從程式設計面來看的,當我要呼叫一個系統函式,如果我跨節區 (如 selector 內容都不同),必須跨節區呼叫,系統浪費在呼叫上的資源,包括傳遞的參數,都會佔用很多資源。

尤其是多工環境下,如果你每個呼叫都要跨節區,浪費時間資源在重重的位址換算上,那效能是不可能好到哪去的。XP 透過技巧可以讓所有程式共享同一份系統呼叫程式,但彼此享用的資料資源又可以不互相干擾,是在當時比較好的選擇。

其實想想,這種理念雖然說犧牲了 32位元 CPU 本身其實已經夠龐大的定址空間,但是會想看看它也經歷了10年的考驗。

這種設計方式我記得是稱為 Flat 定址,所有 selector 都是相同的,這樣就不必跨節區呼叫,程式好寫很多,問題也比較少。

其實這樣設計,也經歷了十多年了,現在會推 64 位元,其實也是在 Flat 定址上更進一步,32 位元 4GB 定址,程式只能用2GB到現在,也是過了10多年才不夠用,64位元即使以 Flat 定址來看,每個程式可以定址的空間,是 4GB 的 32 平方倍,以個人電腦而言,我是很難想像我有生知年 64 位元定址會不夠一隻程式用 XD

即使有其他寫程式的就是那麼變態,只不過 4GB 定址還能想像,2^64 次方的數字,我就難以想像囉
     
      
舊 2009-06-16, 03:35 AM #51
回應時引用此文章
RogerShih離線中