天天看點

二 -- (1)

第二章 保護模式
● 80386簡介
    【01:30】8086  尋址空間  1M
    【01:32】80286 尋址空間 16M
    【01:36】80386 尋址空間  4G

● 控制寄存器 (eflags)
    【01:57】eflags 用來訓示微處理器
    【02:41】TF(陷阱标志) 能夠激活微處理器晶片上的調試功能。如果為 1,允許調試;如果為 0,禁止調試。
    【03:05】IF(中斷标志) 控制 INTR引腳的輸入的操作。為1,INTR引腳被允許;為0,INTR引腳被禁止。
        ZC: 被允許 和 被禁止 幹嘛?輸入?
    【03:20】DF(方向标志) ZC: 記得在 有過,清的就是這個标志吧?
    【03:37】IOPL :輸入輸出的優先級。這個标志是用來保護 在保護模式當中操作的時候 被IO裝置選擇優先級。如果目前任務的優先級高于IOPL IO指令就會(順序的執行)順利的執行。如果IOPL比目前任務的優先級低(ZC: 說反了嗎?這裡和前面是一個意思啊) 産生中斷,導緻執行程式被挂起。
        00/01/10/11
        【04:18】00 ==> 最高優先級;11 ==> 最低優先級。

    【04:35】NT(嵌套标志) :在保護模式下 目前執行任務的,目前的執行任務 嵌套于另一個任務當中,這個标志 就被設定了。
    【04:58】RF : 是和 調試寄存器一起使用,控制下條指令之後 恢複程式的執行。
    【05:15】VM :用于在保護模式系統中 選擇虛拟操作的模式。虛拟模式系統允許 多個1M長的DOS存儲分區共存在存儲器系統中,這樣就允許系統執行多個DOS程式。

    ZC:關于這些标志的含義,貌似和網上的一篇文章内容類似,詳見“... ...網頁關于多功能寄存器的說明”裡面儲存的網頁内容。

    【05:45】接下來看 控制寄存器CR0、CR1、CR2、CR3
        【05:55】CR1 :在80386中是沒有使用的,它是為後續的産品保留的。(ZC: 那現在有沒有用到它呢?)
        【06:10】CR2 :儲存 頁故障中斷之前所通路的最後一頁的線性位址
        【06:20】CR3 :儲存 頁目錄的基位址。
            左邊20位(高20位) 總是有效的,低12位 為0。CR3的低12位 與 其它位 一起确定4K長的頁面的起始位址。(ZC: 這裡的"其它位"指的是什麼?)
        【06:52】主要看一下 CR0 :CR0中由許多特定的控制位。
            【07:01】PG(第31位) :值為1 ==> 選擇線性位址到實體位址的轉換(也就是開啟了分頁機制)
            【07:28】ET(第4位) :值為0 ==> 選擇81287協處理器;值為1 ==> 選擇80387協處理器。【07:45】之是以這樣設計這個位,是∵80386剛開始出來的時候還沒有80387(ZC: 協處理器),在多數系統中ET被置位(設定值為1) 表示系統沒有80387
            【08:08】TS(第3位) :表示系統已經切換了位(ZC: 聽得不太清楚)。值為1 ==> 協處理器指令引起類型7的一個中斷,類型7 就是協處理器不存在。
            【08:30】EM(第2位) :值為1 ==> 可以使每條esc指令引起類型7中斷(ZC: 有esc指令?)。我們通常通過這個中斷 用軟體來模拟協處理器指令底下的功能,模拟的方法 可以降低系統的成本,但執行模拟的協處理器指令 通常至少需要100倍的時間。
            【09:05】MP(第1位) :值為1 ==> 表明系統中有協處理器
            【09:12】PE(第0位) :值為1 ==> 選擇 保護模式,開啟段級的保護模式;值為0 ==> 進入實模式。在80286中,該位隻能被置位,86286隻有硬體複位 才能回到實模式(ZC: 什麼是"硬體複位"?)。80386沒有這個限制。

        ZC: 控制寄存器 CR0 中的 PE、PG位 分别控制 分段機制 和 分頁機制,這裡不是很明白,隻要它們置位了,就強制開啟了 分段/分頁機制?能否在它們置位時 不使用 分段/分頁機制?這個到底是怎麼控制的?隻有它們置位時才能使用 分段/分頁 相關的寄存器?


【09:53】
“
● 實模式寄存器尋址
1、段 和 偏移
2、預設段 和 偏移寄存器

● 保護模式尋址
1、選擇子 和 描述符
”
    【10:41】保護模式 和 實模式 尋址差別:
        保護模式下的 段位址 不再像 實模式那樣 由段寄存器提供,在原來存放段位址的段寄存器裡面含有一個選擇子(或者叫 段選擇子,或者叫 選擇符)。選擇子 用來 選擇 描述符表内的一個描述符。描述符 描述 存儲器段的位置/長度/通路的權限。【11:20】由于 段寄存器 和 偏移位址 仍然用于通路存儲器,是以 保護模式指令 和 實模式指令 都是完全相同的。【11:42】兩種模式之間的差別 就是 微處理器通路存儲器段的時候 對段寄存器的解釋不同(ZC: 是以需要看CR0的PE/PG位來決定使用哪種方式)。另一個差别是在保護模式下,可以用32位數取代16位數,32位的偏移位址微處理器通路長達4G的段内的資料。


【12:22】“1、選擇子 和 描述符”
    裝在 段寄存器裡的選擇子,從兩個描述符表(GDT全局描述符表 或者 LDT本地描述符表)中的任意一個中,選擇8192個描述符中的一個。
    【12:47】描述符 :它是用來說明存儲器的段的 位置/長度/通路權限 的。
    段寄存器 仍然選擇一個存儲器段,但是不再像實模式那樣直接選 而是間接的選擇。
    【13:26】GDT全局描述符表 包含 适用于所有程式的段定義。
    【13:33】LDT局部描述符表 通常隻适用于 唯一的應用程式。
    【13:41】可以把全局描述符 稱為 系統描述符,局部描述符表 稱為 應用描述符。
    【13:49】每個描述符表 最多包含 8192個。∴ 在任何時刻應用程式最多可以有16384個描述符。
        ZC: 16384 和 8192 的關系是怎麼确定的?(16384 / 8192 = 2) 
        ZC: 16384 和 8192 這兩個數字是如何得到的?和 4G(4194304) 又有什麼關系?
        ZC: 4194304 /  8192 = 512
        ZC: 4194304 / 16384 = 256
    【14:00】∵一個描述符 說明一個存儲器段,這就允許為每一個應用程式描述多達16384個存儲器的段
    【14:20】描述符的基位址部分,隻是存儲器段的起始位置。80386以及更高等型号的微處理器 使用32位的基位址,允許段的起始于4G存儲器中的任何一個地方。段界限包含段中最大的偏移位址。
    【15:00】80386以及更高等型号的微處理器 可以通路長度 :1位元組~1M位元組 或者是 4K位元組~4G(ZC:位元組) 之間的存儲器段。為何會有兩個段呢?原因:描述符中 有一個"G"位,這個位 表示顆粒度。"G"位值為1時,它的增長的比例是以4K位機關的,∴它是 4K位元組~4G(ZC:位元組) 之間。"G"位值為1時,以位元組位增長的機關,∴是 1位元組~1M位元組 之間。
    【16:03】"AVL"位 :訓示 段 是有效的/無效的。值為1 ==> 表示這個段是有效的;值為0 ==> 表示這個段是無效的。
    【16:30】描述符的長度 是 8個位元組(ZC: 怪不得有兩個0-32位)
    【16:46】"D/B"位 :D位 訓示 是在保護模式下 或者 是在實模式下 指定是怎樣通路寄存器或者存儲器的資料。若 D==0 :指令 跟8086~80286之間的微處理器相容,是16位的指令,這就意味着指令在預設方式下是16位的偏移位址和16位的寄存器,這種方式通常稱為16位指令方式。若 D==1 :那麼指令就是32位指令,預設情況下 32位指令 描述 假定 所有KAD裡和寄存器都是32位的。(ZC: kad?什麼東西?)
    【17:42】第8~16位(ZC: P/DPL/S/Type) :是 通路權限位元組,它控制 對保護模式中存儲器段的通路。這個位元組(ZC: 這裡是指"通路權限位元組"還是指"S"?) 描述了段在系統中是怎樣起作用的。通路權限位元組 全面的控制着段。如果是資料段 就指定它的增長方向,如果段的增長超出了它的界限,微處理器的程式就被中斷了 并且給出一個一般的保護錯誤。使用者可以說明一個資料段 是否為可寫或者是寫保護。也可以用類似的方式控制代碼段。為了保護軟體還可以禁止讀。

    【18:45】描述符 是通過 段寄存器 從描述符表中選擇的。段寄存器包含了一個13位的段選擇子字段。TI:表選擇字段。RPL:請求優先級字段。
        【19:23】3~15位(共13位)的選擇子字段,可以從描述符表的8192個描述符中選中一個。
        【19:35】TI:指明 全局描述符表(Ti == 0) 還是 局部描述符表(Ti == 1).
        【19:58】RPL:請求優先級字段。請求存儲器段的通路優先級,最進階==0x00,最低級==0x11。
            【20:23】如果 請求優先級 和 通路權限設定的優先級 相比對或者高于它,就允許通路。
            【20:33】優先級 用于多使用者環境中。如果違背了優先級,系統通常隻是一個優先級違例的錯誤。

【20:45】
“
2、程式不可見寄存器
”

    存儲器系統中有 全局描述符表 和 局部描述符表,為了通路和指定這些表的位址,微處理器中包含有一些程式不可見寄存器。
    【21:08】程式不可見 就是指 不能被普通的程式通路 但是能被系統軟體通路 可以被作業系統核心通路 (的寄存器).
    【21:22】在保護模式下 操作的時候,這些寄存器(程式不可見寄存器)控制微處理器.
    【21:35】GDTR :全局描述符表 寄存器
    【21:38】IDTR :中斷描述符表 寄存器
    【21:43】Task Register :TR 任務寄存器
    【21:47】LDTR :本地描述符表 寄存器

    【21:55】保護模式中 每個段寄存器 含有一個程式的不可見的區域,這些寄存器的程式不可見區域 通常稱為高速緩沖/高速緩沖器(翻譯過來就是 cache,但是這個cache 和 微處理器中的一級二級高速緩存的cache是不一樣的)。
        【22:25】每當段寄存器中的數發生改變的時候,基位址 界限 通路權限 就裝入段寄存器的程式不可見區域。
        【22:35】當一個新的段号 被放到段寄存器裡的時候,微處理器就通路 描述符表,并把描述符裝入 段寄存器的程式不可見高速緩沖中。這個描述符 一直儲存在 這個地方, 在通路存儲器段的時候使用,直到段号再次發生變化。這樣就允許微處理器重複通路存儲器段,不必每次都去查詢描述符表,是以它稱為高速緩沖的寄存器。
    【23:23】GDTR 和 IDTR,包含的是描述符表的 基位址 界限。∵描述符表最大的長度為 64Kb,∴兩個表的界限是16位。【23:41】當工作在保護模式的情況下,全局描述符表 基位址 界限 裝入GDTR中,在使用保護模式之前 必須初始化中段描述符IDTR。
    【24:08】局部描述符表的位置 是從全局描述符表中選擇的。為了尋址局部描述符表 建立了一個 全局描述符,需要通路局部描述符表的時候,把選擇子裝入IDTR中,就像在段寄存器中裝入選擇子是一樣的。【24:39】這個 選擇子 通路 全局描述符表,并且 局部描述符表的 基位址 界限 通路權限 裝入LDTR的高速緩沖存儲器中。(ZC: 這裡,由 将"高速緩沖寄存器"改為"高速緩沖存儲器",是否上面也講錯了?)
    【25:01】TR 包含有一個選擇子,這個選擇子 用來通路 一個确定的任務的描述符,任務 通常就是程序/應用程式。程序/應用程式 的描述符 存儲在 全局描述符表中,是以 可以通過優先級控制對它進行通路。【25:33】任務切換機制 允許微處理器在足夠短的時候内實作任務之間的切換,也允許多任務系統以簡單而規則的方式 從一個任務切換到另一個任務。


【25:55】
“
● 分頁機制
1、分頁寄存器
”
    【26:03】80386和更進階的微處理器 它的分頁機制 允許為任何的線性位址配置設定實體存儲器的位址。線性位址 就是由程式産生的位址,通過記憶體分頁機制 線性位址透明的轉換為實體位址,這樣 就能使 需要的 在特定位址上運作的程式通過分頁機制重定位。

    【26:45】微處理器中 控制寄存器的内容 控制分頁的機關,對分頁機關至關重要的寄存器 就是CR0和CR3。
    【27:02】CR0的最左邊 第31位 PG位 :置位==>選擇了分頁機制 ; PG 清零 ==> 程式産生的線性位址 就是位于尋址存儲器的實體位址 。 PG 置1的時候 線性位址通過分頁機制 轉換成了實體位址。

    【27:35】CR3 的内容,包括頁目錄基位址 以及 PCD和PWT。我們主要講解 頁目錄基位址,它是從第12位到第31位。頁目錄基位址 是被 頁轉換部件尋址頁目錄,這個位址可以尋址存儲器中以4K為邊界的頁目錄。
        ZC:"頁目錄基位址用于為頁轉換部件尋址頁目錄"這句話,可參看“Intel微處理結構.docx”。
        【28:16】頁目錄 包含 1024個 (頁)目錄項,每項長度是4位元組。每個頁目錄項尋址一個包含1024項的頁表。

    【28:38】由軟體生成的線性位址,分成3部分,分别用于 尋址 頁目錄項(Directory),頁表項(Table),偏移位址(Offset)。每一個頁目錄項代表存儲系統的4M的一個區域,頁目錄的内容選擇 由随後的10位線性位址 訓示的頁表 ,這是一個4K的區域。線性位址的偏移部分 選擇4K頁内的一個位元組。∵進行4K存儲區 重新分頁的操作 要求通路存儲器内的頁目錄和頁表,∴Intel創造了一個稱為TLB的 高速緩沖存儲器。如果要通路某個存儲區 而且它的位址已經在TLB中,那麼就不需要 再通路頁目錄和頁表,是以加速了程式的執行。如果一個頁表轉換不在TLB中,那麼必須通路頁目錄和頁表。


【30:13】
“
2、頁目錄和頁表
”
    【30:25】圖中顯示的就是 怎麼樣把一個線性位址轉換成實體位址的一個過程。它(ZC:線性位址?)的第22位到第31位,指定了頁目錄,頁目錄 的基位址是由CR3來決定的,它(ZC:CR3的PDBR?)指定了頁目錄中 某一個目錄項。
        【30:50】第12位到第21位,指定了 某一個目錄項中的一個頁表項。
        【31:00】Offset,然後 偏移值 加上 頁表項 就構成了實體位址。


【31:15】
“
● 80386存儲管理
1、描述符和選擇子
”
    【31:23】80386中的存儲管理單元 MMU 和 286中的MMU 是很類似的,隻是80386中包含了分頁單元 286中沒有。
    【31:41】MMU是用來完成 把程式中輸出的線性位址轉換成實體位址的。
    【31:51】80386 利用分頁機制 把實體位址配置設定到邏輯位址,是以 如果分頁是激活的 即使程式指令需要通路 比如說A0000單元 實際的實體位址可能是10000H單元 或者其他單元。這個特點 實際上使得對任意存儲單元進行操作的軟體 都能運作在80386上,∵任何的線性位址 都可以變換為實體位址。

    【32:38】描述符 是描述和定位存儲器段的8個連續的位元組。選擇子 用來從描述符表中檢索描述符。
    【32:52】80386的描述符使用 32位的基位址、20位的界限。
    【33:01】80386中用 32位的基位址 尋址4G的存儲空間。
    【33:10】由于具有兩種不同方式的20位界限,它的段長度可以是1M或4G。為什麼會出現1M和4G呢,是∵顆粒度的原因 G位,G位為0時是1M,G位為1時 允許尋址最大長度是4G。

    【33:45】這個圖(ZC: 上面那張圖)說明了80386在保護模式下,如何用 選擇子、描述符 來尋址 存儲器段。選擇子 用它最左邊的13位 從描述附表中選擇一個描述符,ti位(ZC:有聽錯嗎?)訓示的是 局部描述符表 還是 全局描述符表。我們提到過 ti==0時 是全局描述符表,ti==1時 是局部描述符表。
        【34:28】選擇子最右邊的兩位 RPL,我們也講過,用來定義所需要的通路優先級别。
        【34:40】選擇子 在描述符表中 選擇了一個描述符,這個描述符中有段的基位址,它通過取出基位址 再加上 偏移位址 就得到我們想要的線性位址。
    【34:58】由于選擇子 是用13位的代碼通路描述符,它的整個是16位的(ZC:13+2=15,還有一位是幹嘛的?),∴在每個局部/全局描述符表中最多可以有8192個描述符。由于每個段可以是4G,而我們可以用兩個描述符表 通路 16384個段,這樣就使得80386 可以通路的虛拟存儲器位址可以達到64T,1T=1024G。【36:18】存儲器系統 實際存在的存儲器 是32位位址線,∴隻能是4G。如果在某個時刻,某個程式需要用多于4G的存儲器,就可以把存儲器系統 和 磁盤驅動器 或者其他形式的大容量儲存設備之間 進行交換。
    【36:45】80386有 全局描述符表 和 局部描述符表,還有一個 中斷描述符表IDT。 IDT 是為 中斷描述符 或者 門描述符 設計的。
    【37:11】80386的基位址是32位的 界限域是20位。G位 表示顆粒度,可以是 1 或者是 4K 為倍數的。
    【37:35】我們看一下描述符(ZC: 下面那張圖),看一下各個位代表的含義。
        【37:50】第0位到第15位 表示 段限長。段限長 還有 第16位到第19位,它倆的組合構成了 實際的段限長。
        【38:08】第16位到第31位 是 基位址。第5個位元組 它也是基位址,是以 第5、4、3個位元組 還有第16位到第31位(ZC: 實際應該是 第56位到第63位 吧?) 它們的組合構成了基位址的值。
        ZC: 這裡可以看出描述符是64位長的。
        【38:45】D/B位 :它用來選擇預設的 寄存器的寬度的,如果D==0 寄存器的寬度是16位,如果D==1 寄存器的寬度是32位。
        【39:09】AVL :是由作業系統以适當的方式使用的,通常用來表示描述符所描述的段是否可用。


【39:27】
“
2、段描述符
3、系統描述符
”
    【39:38】ZC: 這張圖 是段描述符?不是 系統描述符?
    【39:45】段描述符 中 通路權限位 是這幾位(ZC: 貌似視訊中指的是第8-16/40-48位,P/DPL/S/Type)。 通路權限位 是用來訓示 描述符所描述的 資料段、堆棧段 或 代碼段 是怎麼工作的。
        【40:12】通路權限的第4個位元組 是 S (ZC: 說明上面确實指的是 P/DPL/S/Type),表示 這個描述符是 系統描述符/資料描述符/代碼描述符。S==0,表示系統描述符,S==1,表示是普通的描述符(可能是 資料描述符 或 代碼段描述符)
        ZC:講到這裡 感覺  段描述符 和 系統描述符 的結構應該是一樣的,都是這個圖裡面的結構。
        【40:47】P :存在位。P==1 表示這個段是存在的,P==0 并且通過描述符通路這個段 會産生一個類型11的中斷 這個中斷表明通路的段在系統中是不存在的。
        【41:17】DPL :描述 描述符優先級,用來設定描述符的優先級。00表示最高優先級,11表示最低優先級。用來對段的通路進行保護。如果用一個比DPL低的優先級 來通路這個段,就會發生越權中斷。多使用者系統中 優先級可以防止對系統存儲區的通路
        【42:06】S==0 表示是 系統段,S==1 表示是 資料段 或者 代碼段。
        【42:24】Type 占用了4位,4位 中有幾個标志,從高位向低位依次為 e标志、x标志、rw标志、a标志
            【42:58】e位 :可執行位。用來選擇 資料/代碼段。
            【43:07】x位 :當 e位==0時,x訓示 資料段/堆棧段 的擴充方向 --> x==0時,段就像資料段那樣向上擴充,若x==1,段就像堆棧段那樣向下擴充。
                當e==1時,x訓示代碼段的優先級被忽略。
            【43:38】rw位 :若e==0,rw位 訓示資料段是否允許寫。若e==1,rw位 訓示代碼段是否允許讀。允許是1,不允許是0 。
            【44:03】a位 :通路位。處理器每次通路段的時候,這個位都被置位為1。作業系統使用這一位跟蹤那些段已經被通路了。

    【44:20】再來看一下 系統描述符
    【44:28】系統描述符 S位為0時,描述符就是系統描述符。
    【44:33】80386系統中有16種可能的系統描述符類型,但是并不是都在80386中使用,有的類型是為80286定義的,使80286上的軟體和80386相容。有的類型是新定義的 并且是80386獨有的,有些還沒有定義,是為後續産品保留的。
        ZC: 這些類型都是 硬體廠商定義的??
        【45:10】怎麼樣表示16種可能的描述符類型呢,每種是什麼類型的呢,是根據 Type,∵Type是4位,用Type來差別它是什麼樣的系統描述符。分别看一下:
            Type==0,無效的。
            Type==1,用于286的任務狀态段。
            Type==2,用于LDT 表示本地描述符的。
            Type==3,表示這個描述符正在執行80286的任務狀态段。
            Type==4,表示 80286的調用門。
            Type==5,任務門。
            Type==6,80286的中斷門。
            Type==7,80286的陷阱門。
            Type==8,無效的。
            Type==9,80386的任務狀态段。
            Type==10,為以後的Intel産品保留。
            Type==11,正在執行的80386的任務狀态段。
            Type==12,80386的調用門。
            Type==13,為以後的Intel産品保留。
            Type==14,80386的中斷門。
            Type==15,80386的陷阱門。



【完畢】      

1、eflags_01.jpg

2、eflags_02.jpg

3、eflags_03.png

4、段描述符_01.jpg

5、段描述符_02.jpg

6、段選擇符(或稱段選擇子)_01.jpg

7、段選擇符(或稱段選擇子)_02.gif

8、程式不可見寄存器.jpg

9、分頁寄存器.jpg

10、頁目錄和頁表.jpg

11、描述符和選擇子.jpg

12、段描述符?系統描述符?.jpg

C