⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000002.htm

📁 80x86保护模式教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┌┐┌┐∞&nbsp;<BR>【&nbsp;80386&nbsp;保护模式简介三&nbsp;】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┘└┘└┘&nbsp;<BR>==========================================================================&nbsp;<BR>前言:&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;前面两集主要是要告诉各位有关&nbsp;IDT.GDT&nbsp;的用法&nbsp;,虽然这样已经可以简单的进&nbsp;<BR>入保护模式&nbsp;,但是它还不足以让你撰写程式&nbsp;,因此笔者还必需往下继续叙说&nbsp;,不过再&nbsp;<BR>往下讲之前&nbsp;,又有一票烦且杂的观念要说&nbsp;,本篇还是继续在&quot;观念&quot;上打转&nbsp;,读者千万&nbsp;<BR>不要以为本篇又是「干古」&nbsp;,如果本篇不懂的话&nbsp;,後面的精彩文章您大概也看不懂&nbsp;,&nbsp;<BR>笔者会尽量把文章写到容易懂的范围。&nbsp;<BR>&nbsp;&nbsp;<BR>--------------------------------------------------------------------------&nbsp;<BR>┌————————┐&nbsp;<BR>│80386&nbsp;暂存器介绍│&nbsp;<BR>└————————┘&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;80386&nbsp;的暂存器除了扩充成&nbsp;32&nbsp;位元以外&nbsp;,亦增加了许多新的暂存器&nbsp;,除了一般&nbsp;<BR>使用者暂存器(AX.BX....SI.DI)各位已经了解以外&nbsp;,也增加了系统暂存器、以及扩充&nbsp;<BR>的旗标&nbsp;暂存器....等等。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>A.使用者暂存器&nbsp;&nbsp;&nbsp;→&nbsp;EAX.EBX.ECX.EDX.ESI,EDI.EBP.ESP&nbsp;<BR>&nbsp;&nbsp;<BR>B.指令指标暂存器&nbsp;→&nbsp;CS.EIP&nbsp;两个暂存器&nbsp;<BR>&nbsp;&nbsp;<BR>C.区段暂存器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;CS.SS.DS.ES.FS.GS&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;虽然&nbsp;80386&nbsp;已经进入&nbsp;32&nbsp;位元时代&nbsp;,但是这几个暂存器仍是&nbsp;16&nbsp;位元的&nbsp;,且多&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;了&nbsp;FS.GS&nbsp;两个暂存器&nbsp;,这两个暂存器并无特殊意义&nbsp;,各位可以把它当做&nbsp;DS.ES&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;来看待。&nbsp;<BR>&nbsp;&nbsp;<BR>D.系统暂存器&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;A.&nbsp;控制暂存器:包含&nbsp;CR0.CR2.CR3&nbsp;三个&nbsp;,各位可能看到漏了一个&nbsp;CR1&nbsp;,原因是&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;386.486.586&nbsp;都没有此暂存器&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;B.&nbsp;除错暂存器:包含&nbsp;DR0.DR1.DR2.DR3.DR6.DR7&nbsp;共六个&nbsp;,也是漏了&nbsp;DR4.DR5&nbsp;两&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个&nbsp;,原因同上&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;C.&nbsp;保护模式分段控制:IDT.GDT.LDT.TR&nbsp;<BR>&nbsp;&nbsp;<BR>--------------------------------------------------------------------------&nbsp;<BR>┌————┐&nbsp;<BR>│工作切换│&nbsp;<BR>└————┘&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;当您设定某些系统暂存器以後&nbsp;,电脑并不会马上反应所设定的工作&nbsp;,必需透过工&nbsp;<BR>作切换的动作才会起动&nbsp;,这个工作切换很难难用文字表达&nbsp;,笔者认为工作切换就是等&nbsp;<BR>级切换的动作。可造成工作切换的指令包含&nbsp;INT_X&nbsp;、JMP&nbsp;TSS区段...等&nbsp;,其中INT_X&nbsp;<BR>是指在&nbsp;V86&nbsp;下的程式若发生中断&nbsp;,电脑会自动切换至保护模式&nbsp;,并呼叫保护模式下的&nbsp;<BR>中断处理程式&nbsp;,再由保护模式下的程式决定是否呼叫原来&nbsp;V86&nbsp;&nbsp;下的中断向量表&nbsp;,而&nbsp;<BR>这切换到保护模式、再切回&nbsp;V86&nbsp;下&nbsp;,&nbsp;共发生两次工作切换......&nbsp;<BR>&nbsp;&nbsp;<BR>┌——┐&nbsp;<BR>│等级│&nbsp;<BR>└——┘&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;保护模式下&nbsp;,等级共有&nbsp;0.1.2.3&nbsp;四个等级&nbsp;,其中第0级等级最高&nbsp;,第3级最低&nbsp;,&nbsp;<BR>而0级因为是最高等级&nbsp;,因此也有人称为「特权等级」&nbsp;,而应用程式的等级为多少呢?&nbsp;<BR>这表示在&nbsp;EFLAG&nbsp;的&nbsp;IOPL&nbsp;(BIT12.13)&nbsp;里&nbsp;,在&nbsp;V86&nbsp;下的等级多半是最低的第3级&nbsp;,所&nbsp;<BR>以此值为&nbsp;'11'。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;或许各位会认为自己去修改这个旗标将自己的等级调高就好了&nbsp;,事实上改好後还&nbsp;<BR>要经过工作切换的动作&nbsp;,等级才能被修改&nbsp;,而经过工作切换的动作後&nbsp;,你的程式控制&nbsp;<BR>权将转交给别人&nbsp;;再简单的说&nbsp;,发生&nbsp;INT_X&nbsp;时&nbsp;,电脑会将等级切换成最高等级(事实&nbsp;<BR>上是由中断表上决定的)&nbsp;,并进入保护模式&nbsp;,之後保护模式的程式再来决定将使用者的&nbsp;<BR>EFLAG&nbsp;切成什麽等级&nbsp;,然後再&nbsp;IRETD切回&nbsp;V86&nbsp;,於是应用程式根本抢不过最早进入保&nbsp;<BR>护模式的家伙。(这样你有办法在V86下抢到最高等级吗....不可能嘛)&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;等级的高低可以决定自己有多少控制权&nbsp;,例如等级最高的人才可以读写系统暂存&nbsp;<BR>器&nbsp;,其馀的人想读写系统暂存器都会发生&nbsp;General&nbsp;Protection&nbsp;Error&nbsp;0D&nbsp;,你可以把&nbsp;<BR>它想像成等级不够&nbsp;,却要读取系统资源&nbsp;,会发生&nbsp;INT_0D&nbsp;,而原本这行指令将不会被&nbsp;<BR>执行&nbsp;,而堆叠里所摆的&nbsp;EIP&nbsp;值也停在这行上面&nbsp;,如果&nbsp;INT_0D&nbsp;的处理程式不去跳过&nbsp;<BR>这个指令&nbsp;,则会永远停在这个指令里(形同当机)。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;V86&nbsp;下发生中断时&nbsp;,会自动&nbsp;PUSH&nbsp;EIP.CS.EFLAG.ESP.SS......数个暂存器&nbsp;,&nbsp;<BR>并自动将&nbsp;SS.ESP&nbsp;的值替换&nbsp;,以免发生中断时&nbsp;,会动用到&nbsp;V86&nbsp;的堆叠&nbsp;,可是如果发&nbsp;<BR>生的是&nbsp;General&nbsp;Protection&nbsp;Error(俗称异常),则会在&nbsp;PUSH&nbsp;EIP&nbsp;之前再多摆入一&nbsp;<BR>个DWORD&nbsp;的错误代码&nbsp;,如果您的程式在&nbsp;IRETD&nbsp;前不减去这个可能存在的错误代码&nbsp;,&nbsp;<BR>则会发生不可预知的後果。这也是保护模式下的程式不好写的原因之一。&nbsp;而SS与ESP&nbsp;<BR>所替换的值&nbsp;,则是最初进入保护模式後&nbsp;,由最高等级的人决定的(摆於TSS区段)。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;第二集里笔者有介绍&nbsp;GDT&nbsp;表&nbsp;,其中有个&nbsp;93&nbsp;代表可写区段&nbsp;,如果设成&nbsp;89&nbsp;,则表&nbsp;<BR>示此区段是&nbsp;TSS&nbsp;表格&nbsp;,再由&nbsp;TR&nbsp;暂存器来指定发生中断时&nbsp;,取用那一个区段的表格.&nbsp;<BR>&nbsp;&nbsp;<BR>举例来说&nbsp;,下面是&nbsp;GDT&nbsp;表格&nbsp;<BR>&nbsp;&nbsp;<BR>gdttab&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;000h,000h,000h,000h,000h,000h,000h,000h&nbsp;;00&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,09bh,000h,000h&nbsp;;08&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,093h,08fh,000h&nbsp;;10&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,089h,000h,000h&nbsp;;18&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,089h,000h,000h&nbsp;;20&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,093h,000h,000h&nbsp;;28&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,007h,000h,000h,000h,093h,000h,000h&nbsp;;30&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,080h,00bh,093h,000h,000h&nbsp;;38&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0ffh,0ffh,000h,000h,000h,093h,000h,000h&nbsp;;40&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;我们可以看到&nbsp;18.20&nbsp;两个&nbsp;Selector&nbsp;正好就是&nbsp;89h&nbsp;,也就是说它们俩个都可以是&nbsp;<BR>TSS&nbsp;描述表格&nbsp;,如果&nbsp;MOV&nbsp;AX,0018、LTR&nbsp;AX&nbsp;,则表示发生工作切换时&nbsp;,取用&nbsp;0018&nbsp;的&nbsp;<BR>描述表格。&nbsp;<BR>&nbsp;&nbsp;<BR>--------------------------------------------------------------------------&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -