win32 段寄存器怎麼尋址

32位cpu 地址線擴展成了32位,這和數據線的寬度是一致的。因此,在32位機裏其實並不需要採用“物理地址=段:偏移”這種地址表達方式。原來在16位機裏規定的 每一個段不大於64kb在32位機裏也不是必要的。所以,對於32位機來講,最簡單的方法就是用一個32位數來標識一個字節的存儲地址,尋址時只要給出一 個32位數就可以直接找到地址。這種地址儲存模型就屬於“平展儲存模型”。

但是,新產品一般都希望遵循“向下兼容”這個原則。所以,32位機裏完整的保留了16位尋址模式。即:尋址能力爲1M;分段機制;每段不超過64kb。這就是通常所說的"實模式"。在地址儲存模型中屬於“實地址儲存模型”。

  其次,考慮到程序通常都是功能化的模塊,所以分段雖然不是必要的,但分段卻能大大提高編程者管理程序的效率。故而32位機也採用了段+偏移的模式來尋址。 但與實模型不同的是,由於地址線和數據線寬度一致,因而,每個段最大可以到4G,並且段基址也是32位的無需進行左移處理。在地址儲存模型中這屬於“段地 址儲存模型”。然而需要注意的是,在32位機裏,雖然通用寄存器,標誌寄存器等都擴展成了32位,但是段寄存器卻依然是16位的(爲什麼不做改變??我猜 可能是這樣便於向下兼容)。所以在32位尋址時,段寄存器裏放的不再是段基址(位數不夠,放不下)而是一個選擇子。這個選擇子對應了一個64-bit長的 描述符,64-bit的描述符裏有32-bit是段基址。所以原來在16位機裏通過段寄存器一步就可以找到段基址,而現在在32位機裏分成了兩步:先找選 擇子,然後通過選擇子找段基址。段基址找到了,再加上偏移地址,物理地址就找到了。看樣子,32位段模式尋址已經介紹清楚了。其實,這裏頭的故事還遠沒有 講完。

   在上面簡述的過程中,很容易發現有兩個問題沒有交待。(1)CPU是如何將選擇子與描述符對應起來的?(2)既然是64-bit的描述符,32位用來表示 基地址,那麼餘下的32位是幹什麼用的?另外,當32位機發展起來的同時,操作系統也有了長足進步,單任務模式的DOS被多任務的windows所取代。 也就是說,現在駐留在內存中的往往不止是一個程序,而很可能是多個程序同時在內存中。現在又沒有了段大小的限制,程序之間便很有可能相互搶地址,如果核心 程序被破壞,計算機就會崩潰。這就好比在馬路上走車,如果只有一輛車開,怎麼開都可以,但是如果車多了不制定個交通規則,車便會搶道,道路就會癱瘓。所 以,在多任務的情況下,必須給尋址也制定一個“交通規則”,這樣才能保證多任務系統有序的工作。制定什麼樣的規則呢?首先,既然程序是在無意識的情況下搶 佔了別的程序的地址,那麼如果在尋址時包含一個查詢的過程就可以有效的避免搶地址的情況發生。也就是說,先得問一問那個地址是不是已經有程序段佔用了?同 時已佔上地址的程序段除了告知CPU自己的基地址外還應該告訴CPU自己的長度信息。這樣別的程序段才能方便地查詢。第二,多任務尋址最好應該包含優先級 別的內容,已備緊急情況下爲核心程序讓道。這好比在馬路上,一般情況下車是遵守規則的,但如果是警車或救護車執行任務時,就可以優先搶佔別的車的道。所 以,還應該定義一個優先級。然後,由占上地址的程序段告訴CPU自己的優先級別。總的來講,原來在16位機裏很單純的一個“段”的概念現在變得複雜了。如 同人的成長過程,剛開始的時候思維總是很幼稚的,相應的也只能解決簡單的問題,只有當你的思維擺脫幼稚的時候,纔有能力解決更爲複雜的事情。現在CPU擺 脫了幼稚的16位,它在描述“段”的時候當然不應該像16位時那麼膚淺。在32位機裏,“段”有三個要素:基地址,長度,屬性(屬性裏包含了優先級和其它 的一些內容)。爲了能一次完整的引用或者給出這三個要素,需要新定義一個數據結構。這個結構就是前面所提到的描述符,每一個描述符都佔有64-bit,有 足夠的長度來包含段的三個要素。當然,現在內存中不止一個程序,而且程序也不止一個段,所以描述符也不會有一個,而是很多個。最簡單的管理方法,就是將所 有的描述符集中起來放在一塊連續的存儲空間裏,然後給各個描述符排上序號。當要找某一個特定的描述符時,只要先找到這塊連續的存儲空間然後給出序號就可以 了。這些集中起來的描述符形成了一張表,所以通常被叫做描述符表。所以,想找到一個段的信息,首先要找到描述符表。也就是說,找特定的描述符先要知道描述 符表的基地址。在32位cpu中,有一個48位的專用寄存器用來存放全局描述符表的信息,這個寄存器叫做GDTR。其中,高32位給出了全局描述符表的基 地址,低16位給出了描述符表的長度限制。所以,一張全局描述符表最長可以是64kb。那麼,最多可以放64kb/8b=8k個描述符。所以如果想在其中 選擇任意一個描述符,用13位就可以辦到了。在32位cpu中,16位段寄存器的高13位就用來存放特定描述符的序號。其實,現在段寄存器的功能就是選擇 描述符,正因爲如此,通常也把段寄存器叫做選擇器。那麼,經過冗長的介紹,現在32位段尋址的過程已經大體依稀浮現在眼前了:在段寄存器裏找到序號,在 GDTR中找到全局描述符表的基地址,然後就可以找到目的描述符。再從描述符中取出段的基地址,然後加上偏移地址,這樣就得到了段的“物理地址”。

    真是令人興奮,這樣的尋址過程爲執行多任務提供了有力的保障,可以想象這是計算機執行性能上的一次飛躍!從此高速的cpu再也不會爲無用武之地發愁了,它 可以最大限度的發揮自己速度快的優勢,同時處理好多個任務。是的,當我們眼前出現了新的景象的時候,我們有理由興奮。但是,我們不應該就此滿足。我們應該 沿着新天地撇給我們的一絲亮光,繼續前行,去找到這片新天地。人就是在這樣的前行中不斷讓事情變得更完美。到這裏,我們對於尋址過程的瞭解,只是開了一個 頭而已,但這是一個好頭,我們體會到了32位cpu的強大優勢。這足以讓我們對完整的32位CPU尋址充滿了期待。讓我們鼓舞士氣,沿着前人的足跡繼續前 行吧!

    我們知道,程序代碼和數據必須駐留在內存中才能得以運行,然而系統內存數量很有限,往往不能容納一個完整程序的所有代碼和數據,更何況現在是多任務系統, 想讓內存駐留所有任務程序顯然不太可能。老式系統就是將程序分割成小份,只讓當前系統運行它所有需要的那部分留在內存,其它部分都留在硬盤。當系統處理完 當前任務片段後,再從外存中調入下一個待運行的任務片段,而且這個工作是由程序員自行完成。顯然這增加了程序員的負擔。
     由此針對多任務系統發展了一種虛擬內存技術。虛擬內存技術就是一種由操作系統接管的按需動態內存分配的方法,它允許程序不知不覺中使用大於實際物理空間大 小的存儲空間(其實是將程序需要的存儲空間以頁的形式分散存儲在物理內存和磁盤上)。虛擬內存是將系統硬盤空間和系統實際內存聯合在一起供進程使用,給進 程提供了一個比內存大得多的虛擬空間。在程序運行時,把虛擬地址空間的一小部分映射到內存,其餘都存儲在硬盤上(也就是說程序虛擬空間就等於實際物理內存 加部分硬盤空間)。當被訪問的虛擬地址不在內存時,則說明該地址未被映射到內存,而是被存貯在硬盤中,因此需要的虛擬存儲地址隨即被調入到內存;同時當系 統內存緊張時,也可以把當前不用的虛擬存儲空間換出到硬盤,來騰出物理內存空間。      這樣,爲了提高系統性能,發展了虛擬內存技術,那麼相應的,32位cpu也應該發展新的尋址技術來管理虛擬內存。這是通過頁機制來實現的。
      因爲使用頁機制的原因,前面提到的通過段機制轉換得到的地址僅僅是作爲一箇中間地址——線性地址了,該地址不代表實際物理地址,而是代表整個進程的虛擬空間地址。還得有一個將虛擬地址轉換成物理地址的過程。

      讓我們來認識一下頁機制。它就是把內存分成一個一個連續的頁,每頁大小4kb。與段不同,頁不是程序功能塊的體現。一個程序功能塊可能佔用好多個頁。現在 內存就像一本書了,一頁一頁的,每頁的容量都是相等的。當然,我們很快可以聯想到,要想能夠很快的找到某頁,最好給這本書分個章或者節什麼的,然後逐級地 向下查詢。這就是32位cpu裏頁目錄和頁表所起的作用。頁目錄的長度是4kb,它最多可以包含1024個頁目錄項,每個頁目錄項32-bit,包含了頁 表的地址和有關信息。所以,頁目錄把4Gb空間分成了1024個頁組,每個頁組4MB的大小。頁表的長度也是4kb,1024個頁表項,每個頁表項32- bit,包含頁的地址和其它信息。這樣,4MB的頁組又被分成了1024個頁面,每個頁面大小4kb。所以找到某一個頁就是先查頁目錄再查頁表這麼一個過 程。爲了找到頁目錄,我們需要知道其基地址。在32位cpu裏,CR3寄存器裏高20位放的就是頁目錄的地址,因爲頁目錄的低12位總是0,這樣保證頁目 錄始終是頁對齊的(每頁大小4kB)。再來看一看前面通過32位段機制找到的線性地址。其高10位是頁目錄的偏移地址,一共1024個頁目錄用10位就可 以標識可能的最大偏移了。加上CR3,就可以找到頁目錄,然後再通過頁目錄找到頁表的基地址,線性地址的中間10位放的是頁表的偏移量,這樣就找到了頁 表。最後頁表的基地址再加上CR3最低12位所表徵的頁表的偏移地址就找到了頁,這個頁的地址就是最終的物理地址。

     前面提到,之所以採用頁機制是爲了虛擬內存技術。所以頁目錄也好,頁表也好,除了地址信息外還有一些屬性信息,比如,當前頁表是不是在內存中等等。這樣才能方便系統管理虛擬內存實施換進換出的功能。這裏就不詳述了。

     總的來講,32位尋址先通過32位段機制找到一個32位地址,如果沒有采用分頁,那麼它就是物理地址。否則,只是一個線性地址,然後再通過CR3,頁目 錄,頁表找到頁的地址,它纔是最終的物理地址。其實,還用很多細節沒有涉及到,比如這裏提到的描述符表是全局描述符表,實際上還有局部描述符表,再比如描 述符只重點介紹了地址位,優先級位和其它屬性位都沒有介紹。但是,一個完整的尋址圖像已經展現在我們眼前了。它包含了32位CPU裏的所有重要機制。剩下 的問題不妨採取暫不過問,現用現學的方法


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章