操作系統篇-淺談實模式與保護模式


|| 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

一、前言

    轉眼之間距離上一篇文章的時間已經一個月左右了,由於工作比較忙,對知識的梳理比較慢但又希望能夠有比較好的東西跟大家一起交流,所以這過程顯得比較久了。好了,不說廢話了,我們首先為進入今天的主題熱熱身。其實,說到操作系統,基本上都會提及實模式與保護模式,而大家在學習過程中可能也只有點模糊的印象。為了方便后期文章的理解,加快我們的學習速度,決定在這里跟大家一起交流一下,當然,這里為了大家比較容易理解,會用比較通俗的說法,在后期文章中涉及到該部分知識的例子時,會跟大家點明。
 
二、實模式 
    a.那究竟實模式是什么呢?
  在計算機上面,實模式存在的時間非常之短,所以一般我們是感覺不到它的存在的。CPU復位(reset)或加電(power on)的時候就是以實模式啟動,在這個時候處理器以實模式工作,不能實現權限分級,也不能訪問20位以上的地址線,也就是只能訪問1M內存。之后一般就加載操作系統模塊,進入保護模式。

  處理器8086 有 20 根地址線(不清楚8086的童鞋,可以自行百度,這可處理器非常有名,資料也很多),可以尋址 1MB 內存。但是,它內部的寄存器16 位的,無法在程序中訪問整個 1MB 內存。所以,它也是第一款支持內存分段模型的處理器。還有, 8086 處理器只有一種工作模式,即實模式。當然,在那時,還沒有實模式這一說。

  由於 8086 處理器的成功,推動着 Intel 公司不斷地研發更新的處理器, 32 位的時代就這樣到來了。盡管 8086 是 16 位的處理器,但它也是 32位架構內的一部分。原因在於, 32 位的處理器架構是從 8086 那里發展來的,是基於 8086 的,具有延續性和兼容性。

  32位處理器有自己的 32 位工作模式。在本系列文章中,保護模式其實就是32位模式。在這種模式下,可以完全、充分地發揮處理器的性能。同時,在這種模式下,處理器可以使用它全部的 32根地址線,能夠訪問4GB 內存。

  b.實模式的尋址方式與工作機理

  其實,8086的段寄存器和IP寄存器都是16位的,如果按照原先的方式,把段寄存器的內容和偏移地址直接相加來形成物理地址的話,也只能得到 16 位的物理地址。麻煩的是,8086卻提供了20根地址線。換句話說,它提供的是20位的物理地址。

  提供 20 位地址線的原因很簡單, 16 位的物理地址只能訪問 64KB 的內存,地址范圍是0000H~FFFFH,共 65536 個字節。這樣的容量,即使是在那個年代, 也顯得捉襟見襯。注意,這里提到了一個表示內存容量的單位“ KB”。為了方便,我們通常使用更大的單位來描述內存容量,比如千字節( KB)、兆字節( MB)和吉字節( GB)。
  所以,65536個字節就是64KB,而 20 位的物理地址則可以訪問多達1MB的內存,地址范圍從 00000H到FFFFFH。問題是,16 位的段地址和 16 位的偏移地址相加,只能形成 16 位的物理地址,怎么得到這 20位的物理地址呢?

  為了解決這個問題,8086 處理器在形成物理地址時,先將段寄存器的內容左移 4 位(相當於乘以十六進制的10,或者十進制的 16),形成 20 位的段地址,然后再同16位的偏移地址相加,得到20位的物理地址。比如,對於邏輯地址 F000H:052DH,處理器在形成物理地址時,將段地址F000H左移 4 位,變成 F0000H,再加上偏移地址052DH,就形成了20位的物理地址 F052DH。
  這樣,因為段寄存器是16位的,在段不重疊的情況下,最多可以將1MB的內存分成65536個段,段地址分別是0000H、0001H、0002H、0003H,……,一直到FFFFH。

  一個地址有段和偏移兩部分組成,物理地址的計算公式為:
                        物理地址(physicaladdress)=段值(segment) * 16 + 偏移(offset)
其中,segment和offset都是16位的。

  在這種模式下,系統計算實際地址的時候是按照對1M求模的方式進行的,這種技術被稱為wrap-around。也就是說,當程序員給出超過1M(100000H-10FFEFH)的地址時,因為邏輯上正常,系統並不認為其訪問越界而產生異常,而是自動從0開始計算。

  三、保護模式

  a.起源

  最開始的程序尋址是直接的“段:偏移”模式,這樣的好處是所見即所得,程序員指定的地址就是物理地址,物理地址對程序員是可見的。這就帶來一些問題:1)無法支持多任務2)程序的安全性無法得到保證。

  在windows的舊版本中,我們時不時就死機或者藍屏,其實發生這些問題大部分就是由於內存被破壞引起的。因為在實模式中,將整個物理內存看成分段的區域,程序代碼和數據位於不同區域,系統程序和用戶程序沒有區別對待,而且每一個指針都是指向"實在"的物理地址。這樣一來,用戶程序的一個指針如果指向了系統程序區域或其他用戶程序區域,並改變了值,那么對於這個被修改的系統程序或用戶程序,容易造成軟件甚至系統崩潰。

  而在保護模式下,全部32條地址線有效,可尋址高達4G字節的物理地址空間。擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅為存儲器共享和保護提供了硬件支持,而且為實現虛擬存儲器提供了硬件支持,支持多任務,能夠快速地進行任務切換和保護任務環境,4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼和數據的安全和保密及任務的隔離,支持虛擬8086方式,便於執行8086程序。
  保護模式出現的原因是:保護進程地址空間。這樣,就產生了一個結果:兩種模式下程序的尋址方式發生了變化。

  b.保護模式的尋址方式和工作原理

  在保護模式下的尋址相對實模式來說是比較復雜的,而且涉及到一些概念問題,下面我們先來簡單介紹一下,后期操作系統的系列文章會在有相關知識點的時候進行更為詳細的講解。

  其實在保護模式下地址的表示方式與實模式是一樣的,都是:段(segment):偏移(offset),不過保護模式下,“段”的概念發生了根本性的改變。實模式下,段值還是可以看作是地址的一部分,比如段值為xxxxh表示以xxxx0h開始的一段內存。而保護模式下,雖然段值仍然由原來的cs、ds等寄存器表示,但此時它僅僅變成了一個索引,這個索引指向了一個數據結構的一個表項,表項中詳細定義了段的起始地址、界限、屬性等內容。這個數據結構就是全局描述符GDT(也有可能是LDT,這里我們先介紹GDT,LDT其實跟GDT差不多,我們后期在詳講)。

  GDT的作用是用來提供段式存儲機制,這種機制是段寄存器和GDT中的描述符共同提供的。每個描述符在GDT中占8字節,也就是 2 個雙字,或者說是 64 位。下圖中,下面是低32位,上面是高32位。

 

  很明顯,描述符中指定了 32 位的段起始地址,以及 20 位的段邊界。在實模式下,段地址並非真實的物理地址,在計算物理地址時,還要左移 4 位(乘以 16)。和實模式不同,在 32 位保護模式下,段地址是 32 位的線性地址,如果未開啟分頁功能,該線性地址就是物理地址。

   四、總結

  回顧上面所講的內容,我們主要講解了什么是實模式,什么是保護模式,同時也對這兩種模式的尋址方式進行簡單介紹,也提到了關於描述符的概念,雖然這里只是簡單的介紹了描述符的概念與結構,但這是打入保護模式的關鍵之一,后期文章中也會進行詳細分析,歡迎交流指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM