• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大城小魔

            天下難事,必作于易;天下大事,必作于細(xì)

              C++博客 ::  :: 聯(lián)系 :: 聚合  :: 管理

            公告


            最新評(píng)論

            保護(hù)模式

            保護(hù)模式提供了實(shí)模式中所不具備的豐富多彩的內(nèi)容。Pentium處理器是為保護(hù)模式而特別設(shè)計(jì)的。它內(nèi)部的執(zhí)行管道流水線,執(zhí)行32位指令的效率優(yōu)于執(zhí)行16位指令。

            電腦在啟動(dòng)時(shí)候,Pentium被設(shè)計(jì)運(yùn)行在實(shí)模式下,是為了便于電腦在啟動(dòng)時(shí)候操作系統(tǒng)的啟動(dòng)引導(dǎo)程序的執(zhí)行。


            運(yùn)行在保護(hù)模式下的Intel處理器支持受保護(hù)的分段機(jī)制,同樣也支持分頁(yè)機(jī)制。這意味著地址解析會(huì)變得更加復(fù)雜。在實(shí)模式中,我們只需要在段地址上添加一個(gè)偏移地址便獲得一個(gè)直接與物理內(nèi)存對(duì)應(yīng)的地址值。在保護(hù)模式中,處理器要求在相應(yīng)的位置加載特定的數(shù)據(jù)結(jié)構(gòu)。此外段地址和偏移地址對(duì),可能不再直接對(duì)應(yīng)物理地址,好吧,讓我們繼續(xù)下面對(duì)內(nèi)容...

            保護(hù)模式下的分段機(jī)制

            對(duì)Intel平臺(tái)上的分段機(jī)制理解的最好方法是圖片示例,來解釋它是如何實(shí)現(xiàn)的。一幅好的圖例,勝過長(zhǎng)篇大論,對(duì)于這本問題,尤其如此。所以請(qǐng)認(rèn)真仔細(xì)的看下圖1.9,并跟圖1.8做下比較。你也可以將圖1.9收藏起來,當(dāng)你想看的候可以隨時(shí)看到它。

             


            圖1.9


            首先注意到保護(hù)模式中,使用了圖1.2中所有的完整Pentium寄存器。是的,我們又回到32位寄存器了。同樣,段地址寄存器不再存儲(chǔ)16位的段地址值。而是保存段選擇器。段選擇器是一個(gè)16位的數(shù)據(jù)結(jié)構(gòu),它包含三個(gè)字段。它的組成形式如圖1.10所示。真正重要的字段是索引(index)字段。索引字段存儲(chǔ)了一個(gè)描述符表的索引。索引值由0開始。



            圖1.10

                注釋索引字段在段選擇器中不是地址值。它跟你在C語言中訪問數(shù)據(jù)元素時(shí)使用的索引類似。處理器取得索引值,并通過內(nèi)部必要的計(jì)算將該索引值與該索引值對(duì)應(yīng)的線性地址匹配。注意我這里說的線性地址(linear         address),不是指物理地址。此時(shí)(保護(hù)模式下的分段),線性地址和物理地址是一致的,當(dāng)啟用分頁(yè)機(jī)        制以后,它們就不一致了,記住這一點(diǎn)。


            描述符表是一個(gè)入口數(shù)組,數(shù)組中每個(gè)入口(稱之為段描述符)描述對(duì)應(yīng)內(nèi)存段的相關(guān)屬性。段描述符中包含它所描述內(nèi)存段的基地值。32位的偏移地址加上段描述符的基地值用以指定內(nèi)存字節(jié)的內(nèi)存地址。有兩種描述符表:全局描述符表(Global Descriptor Table -- GDT)和局部描述符表(Local Descriptor Table--LDT)。所有的操作系統(tǒng)必須具備一個(gè)GDT,但是具備一個(gè)可配置多個(gè)LDT。通常,如果一個(gè)LDT被使用,它將用于標(biāo)識(shí)內(nèi)段段所屬的進(jìn)程。GDT的基地址保存在GDTR的系統(tǒng)寄存器中。同樣,LDT的基地值保存在LDTR寄存器中。當(dāng)然,還有一些特定的系統(tǒng)指令用于裝載這些值(例如,LGDT和LLDT指令)。


                注意:本書中討論的大部分操作系統(tǒng)都集中于使用GDT而且很少使用LDT(即使有使用LDT的地方)


            GDTR的大小為48位。GDTR有一個(gè)很明顯的特點(diǎn)是,它存儲(chǔ)兩個(gè)不同的值。第一個(gè)大小為16位的值,用于保存GDT大小,單位是字節(jié)。另一個(gè)32位的值,用于存儲(chǔ)GDT在物理內(nèi)存中的線性基地址。如圖1.11



            圖1.11
            問題:1.處理器如何映射一個(gè)段選擇器的索引到一個(gè)段描述符上呢

             

            答案:處理器從段選擇器取得其指定的索引值,將該值乘以8(因?yàn)槎蚊枋龇?4位的緣故,所以該值要為8字節(jié))然后將結(jié)果加上由GTDR或者LDTR提供的基地址值。

                 注釋:當(dāng)你在看圖1.2時(shí),或許對(duì)另外兩個(gè)內(nèi)存管理寄存器產(chǎn)生了疑惑,其實(shí)我并沒有忘記它們。它們對(duì)于我
               們的討論話題來說并不如GDTR和LDTR這樣重要。IDTR寄存器和IR寄存器是用于管理硬件中斷和多任務(wù)的。本
               書集中討論內(nèi)存管理,所以不會(huì)對(duì)此類寄存器做更深入的討論。如果你對(duì)它們有興趣,我建議你去選一本我
               在本章末尾提供的相關(guān)Intel的手冊(cè)資料

            之前我提到過的 段描述符存儲(chǔ)著它所描述的內(nèi)存的線性基地址。然而,段描述符同樣保存著其他完整的元數(shù)據(jù)。圖1.12更好的展示了在一個(gè)段描述符中陳列的內(nèi)容。在該圖中,我將64位的描述符切分為兩個(gè)32位大小。高階部分位于低階部分的頂部。
            圖1.12
             
            在這個(gè)段描述符64位值中打包了大量信息。正如你所看到的,有些字段被分開存儲(chǔ)在描述符的不同位置。在圖1.11中或許有兩個(gè)字段沒有明顯標(biāo)出。首先是SS標(biāo)志,它標(biāo)識(shí)描述符對(duì)應(yīng)的內(nèi)存段是系統(tǒng)內(nèi)存段還是普通的代碼/數(shù)據(jù)段。系統(tǒng)段,或許看到這個(gè)名詞,你在抓頭皮了,系統(tǒng)段是用于提供中斷處理和多任務(wù)服務(wù)的。我不會(huì)介入這些話題。
             
                注意:在接下來的某些部分你會(huì)看到大量的1-bit的標(biāo)志。這里預(yù)先說明一下,以供后面參考。當(dāng)bit標(biāo)志為1的時(shí)候,它表示被置位,當(dāng)bit標(biāo)志為0的時(shí)候,它表示被清除。底層的操作系統(tǒng)代碼涵蓋大量基于bit的操作。沒有其他方法。使用高級(jí)語言的工程師們總是輕視這類底層代碼的工程師。他們稱這些人為bit-bashers或者bit-twiddlers。程序員真是很命苦呀。
             
            假定SS標(biāo)志被置位,描述符中4位類型的字段描述內(nèi)存段的特定屬性:
             

            表 1.1

            Bit

            Type類型

            Description 描述

            11

            10

            9

            8

            0

            0

            0

            0

            data

            read-only

            0

            0

            0

            1

            data

            read-only, accessed

            0

            0

            1

            0

            data

            read-write

            0

            0

            1

            1

            data

            read-write, accessed

            0

            1

            0

            0

            data

            read-only, expand down

            0

            1

            0

            1

            data

            read-only, expand down, accessed

            0

            1

            1

            0

            data

            read-write, expand down

            0

            1

            1

            1

            data

            read-write, expand down, accessed

            1

            0

            0

            0

            code

            execute-only

            1

            0

            0

            1

            code

            execute-only, accessed

            1

            0

            1

            0

            code

            execute-read

            1

            0

            1

            1

            code

            execute-read, accessed

            1

            1

            0

            0

            code

            execute-only, conforming

            1

            1

            0

            1

            code

            execute-only, conforming, accessed

            1

            1

            1

            0

            code

            execute-read, conforming

            1

            1

            1

            1

            code

            execute-read, conforming, accessed

             
            已訪問內(nèi)存段是指最近被訪問過的內(nèi)存段,所以這些內(nèi)存段描述符位于8bit上的標(biāo)志被置位。‘Expand down’ 段用于創(chuàng)建堆棧,因?yàn)檫@些段支持內(nèi)存堆棧創(chuàng)建,創(chuàng)建由高端內(nèi)存向低端內(nèi)存延伸(故名Expand down段)。‘Conforming code’段允許較低權(quán)限的代碼段跳轉(zhuǎn)進(jìn)來,并以允許這些代碼以較低的權(quán)限在該段內(nèi)運(yùn)行。 
            具備安全意識(shí)到系統(tǒng)工程師會(huì)適時(shí)的發(fā)出警告,謹(jǐn)慎對(duì)待當(dāng)他們處于允許操作系統(tǒng)內(nèi)存段設(shè)置為Conforming code’段時(shí)的環(huán)境的時(shí)。
             
            問題:1.好了,我們明白了這些內(nèi)存段的分類和段描述符中存儲(chǔ)的元數(shù)據(jù)的種類。那么這些內(nèi)存段是如何被保護(hù)的呢
            答案: 原來是,段選擇器和段描述符包含大部分用于實(shí)現(xiàn)保護(hù)方案所需的大量信息。處理器充分的利用了這些元數(shù)據(jù)信息跟蹤內(nèi)存訪問的違規(guī)行為。例如,段描述符里的大小限定字段用于保存內(nèi)存段內(nèi)存引用的起始位置到結(jié)束位置。同樣段描述符內(nèi)的類型字段確保該內(nèi)端段指定為只讀不能寫入。處理器利用段選擇器和段描述符內(nèi)的權(quán)限字段防止非法的可執(zhí)行代碼或者非法數(shù)據(jù)獲得較高權(quán)限。 
             
                注釋:這點(diǎn)很容易混淆--0x00是最高權(quán)限,雖然它是最小的數(shù) 
             
            權(quán)限級(jí)別是操作系統(tǒng)用于防止用戶應(yīng)用程序操縱內(nèi)核文件并危及系統(tǒng)安全。在實(shí)模式的討論中,你見過使實(shí)模式系統(tǒng)被破壞和崩潰是如何的簡(jiǎn)單。我只是在中斷向量表上跳了一小段華爾茲并擦除了里面的數(shù)據(jù)。在保護(hù)模式中,這樣的威脅,已經(jīng)被化解了。重要的數(shù)據(jù)結(jié)構(gòu)和操作系統(tǒng)代碼可以在硬件層得到很好的保護(hù)。
            Intel平臺(tái)支持四種不同的權(quán)限級(jí)別(0-3)。另一種說法是Intel支持四種保護(hù)環(huán)。這些保護(hù)環(huán)如圖1.13所示。這是到目前以來涉及內(nèi)存保護(hù)到結(jié)構(gòu)中極其簡(jiǎn)潔的一種了。很多年前當(dāng)Control Data在編寫NOSVE操作系統(tǒng)的時(shí)候,系統(tǒng)構(gòu)架師想要15個(gè)內(nèi)存保護(hù)環(huán)!同時(shí)代古怪的事情類似Linux和Windows,它們只實(shí)現(xiàn)了兩個(gè)內(nèi)存保護(hù)換(一個(gè)給系統(tǒng)內(nèi)核,另一個(gè)給系統(tǒng)內(nèi)核以外的所有部分)。他們都沒有充分利用Pentium所提供的內(nèi)存保護(hù)功能。
             

            圖1.13
            當(dāng)一個(gè)內(nèi)存被使用,處理器會(huì)執(zhí)行一系列的檢查。這些檢查是在內(nèi)存地址解析到它的實(shí)際物理位置中同時(shí)進(jìn)行。因?yàn)檫@些檢查和地址解析并發(fā)執(zhí)行在相同時(shí)鐘周期中,因此不會(huì)產(chǎn)生性能問題。將內(nèi)存管理的任務(wù)交由硬件來完成真是再好不過了。如果處理器的某項(xiàng)檢查偵測(cè)到內(nèi)存保護(hù)的非法操作,處理器會(huì)產(chǎn)生一個(gè)異常。異常是由處理器發(fā)出的一個(gè)信號(hào)。處理器的各種中斷處理功能會(huì)捕獲并且處理這些異常。詳細(xì)的過程已經(jīng)超出了我們的話題。籠統(tǒng)的來說,處理器利用特定的數(shù)據(jù)結(jié)構(gòu)——類似中斷描述符表(IDT),將異常轉(zhuǎn)交給操作系統(tǒng),由操作系統(tǒng)來決定采取何種處理方式。當(dāng)操作系統(tǒng)啟動(dòng)時(shí)候,它有負(fù)責(zé)為處理器進(jìn)行類似IDT的初始化和設(shè)置工作。這使得操作系統(tǒng)可以自由的在IDT注冊(cè)特定的處理程序,當(dāng)發(fā)生非法內(nèi)存操作的時(shí)候,相關(guān)的處理程序能夠被調(diào)用。 當(dāng)Windows中發(fā)生一個(gè)內(nèi)存異常時(shí),一個(gè)典型對(duì)話框會(huì)出現(xiàn),提示非法內(nèi)存訪問,并且Windows會(huì)終止你的程序,如果想知道我所要表達(dá)的意思,那就在Windows編譯并且運(yùn)行下面的代碼:
             
            * --overflow.c-- */
            #include<stdio.h>

            void main()
            {
            int array[4];
            int i;
            for(i=0;i<100;i++)
            {
            array[i]=i;
            printf("set array[%d]=%d\n",i);
            }
            return;
            }
             

            上面的代碼中有一個(gè)明目張膽的數(shù)組越界。當(dāng)你運(yùn)行這個(gè)程序時(shí),程序會(huì)崩潰,Windows會(huì)顯示一個(gè)如圖1.14中所示的對(duì)話框。如果你以前還沒有見過這樣的對(duì)話框,好好看看吧。如果你在Windows上進(jìn)行某種大量指針相關(guān)的程序開發(fā),你遲早會(huì)看到它。

            圖1.14

             

            我沒有對(duì)控制寄存器說太多。跟目前這部分內(nèi)容最相關(guān)的寄存器是是CR0寄存器。我們會(huì)在下一部分看到另一對(duì)寄存器。CR0寄存器的第一位(最低順序位)被稱為PE標(biāo)志位(作為保護(hù)模式開啟的標(biāo)志)。通過將PE標(biāo)志位置1,我們將處理器切換至保護(hù)模式開啟所有我們前面討論的段保護(hù)機(jī)制。下面是一個(gè)完成這個(gè)關(guān)鍵工作的匯編代碼的片段

             MOV EAX,CR0
            OR AL,1
            MOV CR0,EAX
            另一個(gè)達(dá)到同樣目的的方法是使用特定目的的SMSWLMSW system 指令: 
             SMSW AX
            OR AL,1
            LMSW AX
            在這里,你已經(jīng)反復(fù)聽到很多名詞:選擇器(selector),描述符(descriptor)等等。如果
            這是你第一次聽到關(guān)于保護(hù)模式的內(nèi)容。你或許還在混淆它們到底是什么。下面是一個(gè)是一個(gè)簡(jiǎn)
            的概要,有助于你記住這一些列的名詞和相互關(guān)系:

            Cast Member

            Purpose

             段選擇器
            Segment selector

            在描述符表中選擇一個(gè)描述符
            Selects a descriptor in a descriptor table

            段描述符 
            Segment descriptor 

            描述一個(gè)內(nèi)存段(元數(shù)據(jù)信息)
            Describes a memory segment (metadata)

            描述符表
            Descriptor table 

            保護(hù)一個(gè)段描述符數(shù)組
            Holds an array of segment descriptors

            描述符表寄存器 
            Descriptor table register

            存儲(chǔ)描述符表的基地址 
            Stores the base address of the descriptor table

             

            如果分頁(yè)還沒有被啟用,由圖1.9中的結(jié)構(gòu)所生成的最終地址同樣也是物理地址,該地址值與處理器放置到它的32位地址線的值是相同的。如果啟動(dòng)了分頁(yè),情況不會(huì)再是這樣,引導(dǎo)我們進(jìn)入下一個(gè)部分:保護(hù)模式下的分頁(yè)機(jī)制

            posted on 2008-12-11 10:16 momor 閱讀(1150) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 翻譯
            99久久精品影院老鸭窝| 久久亚洲精品国产亚洲老地址| 伊人久久大香线蕉AV色婷婷色 | 久久国产精品久久精品国产| 久久Av无码精品人妻系列| 色噜噜狠狠先锋影音久久| 亚洲午夜久久久| 精品久久久久久中文字幕| 久久精品无码专区免费 | 久久99精品国产| 日产久久强奸免费的看| 97久久精品国产精品青草| 思思久久99热免费精品6| 精品久久久久久无码专区不卡| 激情久久久久久久久久| 人人狠狠综合久久88成人| 欧美久久久久久午夜精品| 国产亚洲精品自在久久| 久久成人小视频| 久久国产成人| 国产亚州精品女人久久久久久 | 国产麻豆精品久久一二三| 人人狠狠综合88综合久久| 亚洲国产精品久久久久婷婷老年| 香蕉99久久国产综合精品宅男自 | 精品久久久无码人妻中文字幕| 久久久国产乱子伦精品作者| 色狠狠久久综合网| 国产精品欧美久久久久无广告 | 久久精品国产亚洲7777| 久久精品男人影院| 国产成人精品免费久久久久| 久久久久亚洲AV片无码下载蜜桃| 久久精品亚洲福利| 久久国产精品偷99| 精品一久久香蕉国产线看播放| 999久久久无码国产精品| 成人久久久观看免费毛片| 97久久超碰国产精品2021| 久久精品九九亚洲精品| 7777久久亚洲中文字幕|