1. 程式人生 > >彙編學習筆記之真實模式/保護模式記憶體定址

彙編學習筆記之真實模式/保護模式記憶體定址

真實模式下的記憶體地址
    2的10次方是1K,20次方就是1M,30次方就是1G。
    Intel 8086是16位CPU,它只有16位暫存器、16位資料匯流排和20位地址匯流排,它只能執行在真實模式。在真實模式,實體地址=段值*16+偏移,段值和偏移都是16位的 具有1MB(2^16 * 2^4 + offset)的定址能力。
    從80386開始CPU有32位地址線,所以定址空間可以達到4GB。單從定址這方面說,使用16位暫存器的方法已經不夠用了,必須要開發一種新方法。在保護模式下,雖然CPU還是使用原來16位的cs、ds暫存器表示記憶體地址的段值,不過保護模式下的段值只是一個索引,這個索引指向一個數據結構的一個表項就是GDT(or LDT)。
在保護模式下,CPU有著巨大的定址能力,併為強大的32位作業系統提供了更好的硬體保障。
    注:
    1.32位地址線的CPU下,16位cs/ds暫存器表示的記憶體地址段值只是一個索引,指向全域性描述符表GDT,通過查表可知真實的基址。
    2.8086CPU與80386CPU,只有cs與ds兩個段暫存器還是16位!!!

    問題來了!!!!!!!!!!!!!!!
    x86CPU工作在保護模式時,可以使用全部32根地址線訪問4GB的記憶體,然而x86CPU(80386)的所有通用暫存器都是32位的.因此,用任何一個通用暫存器來間接定址,不用分段就可以訪問4G空間中任意的記憶體地址。
    那麼為什麼還需要分段定址?
    在保護模式下,一個地址空間是否可以被寫入,可以被多少優先順序的程式碼寫入,是不是允許執行等等涉及保護的問題就出來了。要解決這些問題,必須對一個地址空間定義一些安全上的屬性。段暫存器這時就派上了用場。
    但是設計屬性和保護模式下段的引數,要表示的資訊太多了,要用64位長的資料才能表示。我們把著64位的屬性資料叫做段描述符,上面說過,它包含3個變數:段物理首地址、段界限、段屬性 80386的段暫存器是16位(注意:通用暫存器在保護模式下都是32位,但段暫存器沒有被改變)的,無法放下保護模式下64位的段描述符。如何解決這個問題呢?方法是把所有段的段描述符順序存放在記憶體中的指定位置,組成一個段描述符表(Descriptor Table);而段暫存器中的16位用來做索引資訊,這時,段暫存器中的資訊不再是段地址了,而是段選擇子(Selector)。可以通過它在段描述符表中“選擇”一個專案已得到段的全部資訊。那麼段描述符表存放在哪裡呢?80386引入了兩個新的暫存器來管理段描述符,就是GDT和LDT。這樣,用以下幾步來總體體驗下保護模式下定址的機制
1、段暫存器中存放段選擇子Selector
2、GDT中存放著段描述符表的首地址
3、通過選擇子根據GDT中的首地址,就能找到對應的段描述符
4、段描述符中有段的物理首地址,就得到段在記憶體中的首地址
5、加上偏移量,就找到在這個段中存放的資料的線性地址(只有分段機制情況下,就是真實實體地址)。

    接上面所述,GDT的作用就是用來提供段式儲存機制,這種機制是通過段暫存器和GDT中的描述符共同提供的。因為要能夠訪問4GB記憶體,所以在32位模式下實體地址不能等於 段值*16+偏移 (這種方法定址1MB)。於是,設計者讓段值*16指向一個數據結構的一個表項就是GDT(or LDT),表項中詳細定義了段的起始地址,界限和屬性等內容。於是原先“段:偏移”形式的邏輯地址經過段機制轉化成線性地址。如果只有分段機制,那麼這個地址就是對應的真實記憶體的實體地址。
    注:如何實現8086CPU與80386CPU的相容,判斷段地址表示意義。

另:
    為什麼要分頁?
    其實它的主要目的在於實現虛擬儲存器。
    接上面所述,剛剛說到線性地址,並且說如果只有分段機制,線性地址就是實體地址
    如果打開了分頁機制後:
        邏輯地址-》分段機制-》線性地址-》分頁機制-》實體地址
    是這樣一套轉化機制。

    另外,如果你寫完一個程式後,複製了一份,然後同時除錯。你會發現,從變數地址到暫存器的值,這兩個程式幾乎全部是都是一樣的,而這些一樣的地址之間完全不會被混淆,而是各自完成自己的職責,這也是分頁機制的功勞。
    另外,因為分頁機制的存在,程式使用的都是線性地址空間,而不再直接是實體地址。這好像是作業系統位應用程式提供了一個不依賴於硬體(實體記憶體)的平臺,應用程式不必關心實際上有多少實體記憶體,也不必關心正在使用的是哪一段記憶體,甚至不必關心某一個地址是在實體記憶體裡面還是在硬碟中。只要像作業系統申請就行,而作業系統全權負責了這其中的轉換工作。