一、前言
轉(zhuǎn)眼之間距離上一篇文章的時間已經(jīng)一個月左右了,由于工作比較忙,對知識的梳理比較慢但又希望能夠有比較好的東西跟大家一起交流,所以這過程顯得比較久了。好了,不說廢話了,我們首先為進入今天的主題熱熱身。其實,說到操作系統(tǒng),基本上都會提及實模式與保護模式,而大家在學習過程中可能也只有點模糊的印象。為了方便后期文章的理解,加快我們的學習速度,決定在這里跟大家一起交流一下,當然,這里為了大家比較容易理解,會用比較通俗的說法,在后期文章中涉及到該部分知識的例子時,會跟大家點明。 二、實模式 a.那究竟實模式是什么呢? 在計算機上面,實模式存在的時間非常之短,所以一般我們是感覺不到它的存在的。CPU復位(reset)或加電(power on)的時候就是以實模式啟動,在這個時候處理器以實模式工作,不能實現(xiàn)權(quán)限分級,也不能訪問20位以上的地址線,也就是只能訪問1M內(nèi)存。之后一般就加載操作系統(tǒng)模塊,進入保護模式。
處理器8086 有 20 根地址線(不清楚8086的童鞋,可以自行百度,這可處理器非常有名,資料也很多),可以尋址 1MB 內(nèi)存。但是,它內(nèi)部的寄存器16 位的,無法在程序中訪問整個 1MB 內(nèi)存。所以,它也是第一款支持內(nèi)存分段模型的處理器。還有, 8086 處理器只有一種工作模式,即實模式。當然,在那時,還沒有實模式這一說。
由于 8086 處理器的成功,推動著 Intel 公司不斷地研發(fā)更新的處理器, 32 位的時代就這樣到來了。盡管 8086 是 16 位的處理器,但它也是 32位架構(gòu)內(nèi)的一部分。原因在于, 32 位的處理器架構(gòu)是從 8086 那里發(fā)展來的,是基于 8086 的,具有延續(xù)性和兼容性。
32位處理器有自己的 32 位工作模式。在本系列文章中,保護模式其實就是32位模式。在這種模式下,可以完全、充分地發(fā)揮處理器的性能。同時,在這種模式下,處理器可以使用它全部的 32根地址線,能夠訪問4GB 內(nèi)存。
b.實模式的尋址方式與工作機理
其實,8086的段寄存器和IP寄存器都是16位的,如果按照原先的方式,把段寄存器的內(nèi)容和偏移地址直接相加來形成物理地址的話,也只能得到 16 位的物理地址。麻煩的是,8086卻提供了20根地址線。換句話說,它提供的是20位的物理地址。
提供 20 位地址線的原因很簡單, 16 位的物理地址只能訪問 64KB 的內(nèi)存,地址范圍是0000H~FFFFH,共 65536 個字節(jié)。這樣的容量,即使是在那個年代, 也顯得捉襟見襯。注意,這里提到了一個表示內(nèi)存容量的單位“ KB”。為了方便,我們通常使用更大的單位來描述內(nèi)存容量,比如千字節(jié)( KB)、兆字節(jié)( MB)和吉字節(jié)( GB)。
所以,65536個字節(jié)就是64KB,而 20 位的物理地址則可以訪問多達1MB的內(nèi)存,地址范圍從 00000H到FFFFFH。問題是,16 位的段地址和 16 位的偏移地址相加,只能形成 16 位的物理地址,怎么得到這 20位的物理地址呢?
為了解決這個問題,8086 處理器在形成物理地址時,先將段寄存器的內(nèi)容左移 4 位(相當于乘以十六進制的10,或者十進制的 16),形成 20 位的段地址,然后再同16位的偏移地址相加,得到20位的物理地址。比如,對于邏輯地址 F000H:052DH,處理器在形成物理地址時,將段地址F000H左移 4 位,變成 F0000H,再加上偏移地址052DH,就形成了20位的物理地址 F052DH。
這樣,因為段寄存器是16位的,在段不重疊的情況下,最多可以將1MB的內(nèi)存分成65536個段,段地址分別是0000H、0001H、0002H、0003H,……,一直到FFFFH。
一個地址有段和偏移兩部分組成,物理地址的計算公式為:
物理地址(physicaladdress)