1. 程式人生 > >保護模式及其程式設計——真實模式與保護模式的切換

保護模式及其程式設計——真實模式與保護模式的切換

機器上電,CPU進入真實模式,從實體地址0xFFFFFFFF0處開始執行初始化程式碼,設定基本系統功能操作必要的資料結構資訊,例如處理中斷和異常的IDT表。接下來,如果繼續在保護模式工作,需要載入作業系統模組;如果要進入真實模式,那麼需要進行模式切換。

1.進入保護模式時的初始化操作

處理器能夠進入到保護模式之前,需要作業系統載入和初始化軟體必須在記憶體中設定好保護模式下使用的資料結構的基本資訊。這些資料結構包括
1)保護模式中斷描述符表IDT
2)GDT
3)任務狀態段TSS
4)LDT
5)如果使用分頁機制,起碼要設定一個頁目錄和一個頁表
6)處理器切換到保護模式下執行的程式碼段

能夠切換到保護模式執行之前,需要設定以下系統暫存器
1)GDTR
2)中斷描述符表基地址暫存器
3)控制暫存器CR1~CR3

初始化這些資料結構、程式碼模組和系統暫存器之後,通過設定CR0暫存器的保護模式標誌位PE,處理器就可以切換到保護模式運行了。

1.1保護模式系統結構表


為了實現無分頁的平坦記憶體模型,必須設定至少一個程式碼段和資料段到GDT。在GDT可以使用之前,必須要使用LGDT指令將GDT表的基地址和長度載入到GDTR之中。

多段模型需要作業系統的其他段,以及用於每個應用程式的段和LDT表段。

1.2保護模式異常和中斷初始化


初始化程式碼必須設定一個保護模式IDT,其中至少包含有處理器可能產生的每個異常向量對應的門描述符。

在可以使用IDT之前,必須使用LIDT指令將IDT表基地址和長度載入到IDTR暫存器之中。

1.3分頁機制初始化


分頁暫存器由控制暫存器CR0中的PG標誌設定,在設定PG標誌之前,必須先初始化以下資料結構和暫存器:
1)軟體必須在實體記憶體中建立至少一個頁目錄和一個頁表
2)把頁目錄表的物理基地址載入到CR3暫存器中
3)處理器處在保護模式下

為了保持相容性,設定PG標誌時候必須遵從以下規則:
1)設定PG標誌的指令應該立即跟隨一條JMP指令
2)設定PG標誌和JMP之間的程式碼必須來自對等對映(跳轉之前的線性地址與開啟分頁之後的實體地址相同)的一個頁面上。

1.4多工初始化

如果需要使用多工機制或者允許改變特權級,那麼軟體初始化程式碼需要設定一個TSS及相應的TSS段描述符(因為特權級0、1、2的各棧段指標都需要從TSS中取得)。

在處理器切換到保護模式以後,可以用LTR指令把TSS段描述符的選擇符載入到任務暫存器TR中。在保護模式中,軟體進行第一次任務切換之前必須首先載入在TSS段的選擇符,因為任務切換會把當前任務狀態複製到該TSS中。

在LTR指令執行之後,隨後對任務暫存器的操作由任務切換進行。

2.模式切換

2.1切換到保護模式

切換到保護膜是之前,必須首先載入一些起碼的系統資料結構和程式碼模組。切換操作的步驟:
1)使用cli指令禁止終端
2)執行LGDT命令,載入GDT
3)設定CR0(PE位)
4)mov cr0 之後立刻跟一個遠端JMP或者遠端call指令
5)選擇性執行LLDT
6)執行LTR指令,用初始保護模式任務的段選擇符或者可寫記憶體區域的段描述符載入任務暫存器TR
7)進入保護模式後,段暫存器仍人含有在實地址模式時候的內容,需要進一步處理
8) LIDT
9)開中斷 sti

2.2切換回來真實模式

1)禁止終端
2)如果開啟分頁機制,那麼需要執行:
把程式的控制轉移到對等對映的線性地址處
確保GDT和LDT在對等對映的頁面上
清楚CR0中的PG標誌
設定CR3暫存器為0x00,用於重新整理TLB緩衝
3)把程式的控制轉移到長度為64KB(0xFFFF)的可讀段中。這部操作使用真實模式要求的段長度載入CS暫存器
4)使用含有一下設定值的描述符選擇符來載入SS、DS、ES、FS、GS
段長=64kb
顆粒 G=0
向上擴充套件 E=0
可寫 w=1
存在 p=1
5)執行LIDT指令來指向在1MB真實模式地址範圍內的實地址模式中斷表
6)清楚cr0中的PE位
7)執行一個遠跳轉指令跳轉到一個真實模式程式中。這個操作會重新整理指令佇列,並且為CS暫存器載入何時的基地址和訪問許可權值
8)載入實地址模式程式程式碼會使用的SS、DS、ES、FS、GS

9)執行STI指令開啟可遮蔽硬體中斷,並且執行必要的硬體操作開啟NMI中斷

這裡,我們特別留意其中的第4步和第8步,尤其是第4步中,設定SS等暫存器的目的是為了保證SS等暫存器的不可見部分,到了真實模式之下,仍然有正確的屬性值。

參考:《linux核心0.12完全剖析》

相關推薦

保護模式及其程式設計——真實模式保護模式切換

機器上電,CPU進入真實模式,從實體地址0xFFFFFFFF0處開始執行初始化程式碼,設定基本系統功能操作必要的資料結構資訊,例如處理中斷和異常的IDT表。接下來,如果繼續在保護模式工作,需要載入作業系統模組;如果要進入真實模式,那麼需要進行模式切換。 1.進入保護模式時的初始化操作 處理器能夠進入到保護模

保護模式及其程式設計——中斷和異常處理

摘要:為了提高CPU的利用效率,我們採用了中斷策略來處理某些外部事件。同時,軟體也需要觸發某些中斷和異常,例如除零中斷/page Fault異常等。和子程式呼叫相比,中斷和異常的發生往往是不可預料的,中斷/異常和輪詢相比,能夠顯著提高CPU的工作效率。中斷髮生在任何時刻,相

linux核心 80x86保護模式及其程式設計

這一章涉及intel8086系列cpu的保護模式程式設計,應該是學習核心程式設計,驅動程式設計及嵌入式程式設計一些基礎知識。不過對於沒接觸過底層程式設計的我來說,感覺還是好複雜。   不過裡面也有許多以前彙編學過的東西,大部分還是能看懂的。我覺得圖表就能說明大部分內容了,細

保護模式及其程式設計——分頁機制

摘要:分頁機制是實現虛擬儲存的關鍵,但是它的實現比較簡單。傳統的頁都是<span style="font-family: 'DejaVu Sans Mono', monospace;"><span lang="en-US">4K</span&g

初探面向物件程式設計之oop設計模式

1. 程式設計方式 我們目前的程式設計方式大體可以有以下三種程式設計方式: 順序程式設計 程序式程式設計 面向物件程式設計 在講面向物件程式設計時先講一下什麼是順序程式設計,什麼是程序式程式設計,什麼是面向物件程式設計: 順序程式設計:

Java併發程式設計(4)--生產者消費者模式介紹

一、前言   這種模式在生活是最常見的,那麼它的場景是什麼樣的呢? 下面是我假象的,假設有一個倉庫,倉庫有一個生產者和一個消費者,消費者過來消費的時候會檢測倉庫中是否有庫存,如果沒有了則等待生產,如果有就先消費直至消費完成;而生產者每天的工作就是先檢測倉庫是否有庫存,如果沒有就開始生產,滿倉了就停止生產等待

HeadFirst 設計模式 9迭代器組合模式(餐廳合併)

迭代器模式 提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 迭代器模式讓我們能夠遊走於聚合內的每個元素,而又不暴露其內部的表示。把遊走的任務放在迭代器上,而不是聚合上。這樣簡化了聚合的介面和實現,也讓責任各得其所。 集合collection/聚合ag

設計模式之迭代器組合模式(一)

很高興,這本書總共13章,這次已經是到第9章了;同時也很遺憾,小編脫離了書本,還是不知道如何描述一個設計模式。就比如迭代器與組合模式,原書篇幅比較長,小編儘量通俗易懂些,不到之處,還請各位小夥伴參考原書,小編也歡迎和大家一起交流。 有許多種方法可以把物件堆起來成為一個集合(collection)。你可以把它們

設計模式之迭代器組合模式(二)

在上次的文章中,我們通過層層引導,已經知道了迭代器模式的由來。現在我們再好好總結下。 關於迭代器模式,你所需要知道的第一件事情,就是它依賴於一個名為迭代器的介面。這是一個可能的迭代器的介面: 現在,我們一旦有了這個介面,就可以為各種物件集合實現迭代器:陣列、列表、散列表...如果我麼想要為陣列實現迭代器,

設計模式之迭代器組合模式(三)

現在我們已經能愉快地看著一頁一頁羅列出來的選單進行點菜了。現在又有的小夥伴希望能夠加上一份餐後甜點的“子選單”。怎麼辦呢?我們不僅僅要支援多個選單,甚至還要支援選單中的選單。 如果我們能讓甜點選單變成餐廳選單集合的一個元素,那該有多好。但是根據現在的實現,根本做不到呀。我們想要的是這樣的: 我們需要什麼

設計模式之迭代器組合模式(四)

因為這系列篇幅較長,所以在這裡也不進行任何鋪墊,直奔主題去啦。 利用組合設計選單 我們要如何在選單上應用組合模式呢?一開始,我們需要建立一個元件介面來作為選單和選單項的共同介面,讓我們能夠用統一的做法來處理選單和選單項。換句話說,我們可以針對選單或選單項呼叫相同的方法。 讓我們從頭來看看如何讓選單能夠符合組合

真實模式保護模式的定址方式

文章目錄 一、真實模式定址 二、保護模式定址 三、參考資料 一、真實模式定址 CPU 在真實模式下,地址匯流排只有 20 位,定址空間為 1 M。 20 位的目標實體地址取決於兩個條件,一是 16 位的段基址,二是

x86 真實模式保護模式

0386開始,CPU有三種工作方式:真實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候是real-mode,等到作業系統執行起來以後就切換到protected-mode。真實模式只能訪問地址在1M以下的記憶體稱為常規記憶體,我們把地址在1M 以上的記憶體稱為擴充

CPU的真實模式保護模式(簡介)

16位微處理器 8086暫存器組成 8086/8088包括:4個16位的資料暫存器,2個16位的指標暫存器,2個16位變址暫存器,分成四組。 通用暫存器中,這些暫存器除完成規定的專門用途外,均可用於傳送和暫存資料,可以儲存算術邏輯運算的操作和運算結果。 段暫存器

模式保護模式

虛擬存儲器 有效 偏移 進程 代碼 訪問權限 描述符 兼容 ont 1. 實模式,又叫實地址模式,CPU完全按照8086的實際尋址方法訪問從00000h--FFFFFh(1MB大小)的地址範圍的內存,在這種模式下,CPU只能做單任務運行;尋址公式為:物理地址=左移4位的段

Linux kernel boot process——從真實模式(real mode)到保護模式(protected mode),再到分頁(paging)

        本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟

Linux kernel boot process——從真實模式(real mode)到保護模式(protected mode),再到分頁(paging) .

       本文簡要介紹X86-32架構下的Linux kernel被boot loader(如grub)載入到記憶體後,如何從最初的真實模式,切換到保護模式,並開啟分頁機制。本文不涉及boot loader如何將核心載入到記憶體,因為這是boot loader的事,跟核

真實模式保護模式的區別 真實模式保護模式切換方法

真實模式保護模式區別       從80386開始,cpu有三種工作方式:真實模式,保護模式和虛擬8086模式。只有在剛剛啟動的時候是real-mode,等到linux作業系統執行起來以後就執行在保護模式。          真實模式只能訪問地址在1M以下的記憶體稱為常規記

實戰Java高併發程式設計(五、並行模式演算法)

5.1單例模式 單例模式:是一種常用的軟體設計模式,在它的核心結構中值包含一個被稱為單例的特殊類。一個類只有一個例項,即一個類只有一個物件例項。  對於系統中的某些類來說,只有一個例項很重要,例如,一個系統中可以存在多個列印任務,但是隻能有一個正在工作的任務;售票時,一共有100張票,可有有