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

📄 00000001.htm

📁 80x86保护模式教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>&nbsp;&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;<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;<BR>--------------------------------------------------------------------------&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;进入保护模式可以得到很多好处&nbsp;,让你的程式不再有&nbsp;640K&nbsp;限制&nbsp;,可以产生虚&nbsp;<BR>拟记忆体、拦&nbsp;I/O&nbsp;,所有的应用程式读写系统暂存器&nbsp;,产生中断....都可以完全拦&nbsp;<BR>截&nbsp;,而且&nbsp;TSS&nbsp;工作切换能力可以让你不占用&nbsp;DOS&nbsp;下的堆叠区&nbsp;,还有很多好处无法&nbsp;<BR>一一叙述&nbsp;,因此由笔者来教你如何切入保护模式吧....从简单的开始。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在保护模式下有很多新的名词&nbsp;,包含&nbsp;GDT.LDT.IDT&nbsp;以及&nbsp;CR0-CR3&nbsp;,笔者对保护&nbsp;<BR>模式并不清楚&nbsp;,所以底下资料可能有错误。这里使用大量的线性记忆体观念&nbsp;,请您&nbsp;<BR>一定要从头往後看&nbsp;,否则很可能会看不懂&nbsp;,且必须懂线性记忆体计算方式。&nbsp;<BR>&nbsp;&nbsp;<BR>--------------------------------------------------------------------------&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在进入保护模式时&nbsp;,首先你要先设定&nbsp;GDT&nbsp;表格&nbsp;,这个表格描述主要是来定义每&nbsp;<BR>个段落的记忆体起始位址与长度、存取权。&nbsp;&nbsp;&nbsp;这个情形就好像传统&nbsp;REAL&nbsp;MODE&nbsp;&nbsp;那&nbsp;<BR>样&nbsp;,REAL&nbsp;MODE&nbsp;每个区段的记忆体开始位址与长度都已经由&nbsp;CPU&nbsp;定死了&nbsp;,比如说当&nbsp;<BR>我们看到&nbsp;1000:0000&nbsp;,其实它就是指记忆体的第&nbsp;64K&nbsp;位址&nbsp;,同理看到&nbsp;2000:0000&nbsp;<BR>就代表是第&nbsp;128K&nbsp;位址&nbsp;,定址方式就是&nbsp;Segment:Offset。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;而保护模式的段落起始位址与长度却是可程式变动的&nbsp;,这个可变动的段落起始&nbsp;<BR>位址与长度就是由&nbsp;GDT&nbsp;来设定的&nbsp;,根据这个值&nbsp;,你可以将每个段落改成64K&nbsp;,或是&nbsp;<BR>1MB...甚至更多&nbsp;,可任意设定&nbsp;1BYTE~4GB&nbsp;,所以定址方式变成&nbsp;Selector:Offset&nbsp;<BR>或许您曾用过&nbsp;386DEBUG&nbsp;,看过定址方式为&nbsp;XXXX:XXXXXXXX&nbsp;,根据後面这八位数&nbsp;,&nbsp;<BR>理论上可定址到&nbsp;4GB&nbsp;,其实这是不行的&nbsp;,如果你在&nbsp;GDT&nbsp;表格设定的记忆体为&nbsp;1K&nbsp;<BR>则你尝试&nbsp;DUMP&nbsp;1K&nbsp;以後的记忆体都会看到&nbsp;FF&nbsp;,就好像没有记忆体一般。&nbsp;<BR>&nbsp;&nbsp;<BR>---------------------------------------------------------------------------&nbsp;<BR>Gdtadds&nbsp;dw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0018h,GdtTable&nbsp;32&nbsp;位元线性位址&nbsp;<BR>GdtTable&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00h,00h,00h,00h,00h,00h,00h,00h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7fh,ffh,00h,08h,0bh,93h,00h,00h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;B800:0&nbsp;32K&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ffh,ffh,56h,34h,12h,93h,0fh,78h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^^^^&nbsp;^^^^^^^^^^^&nbsp;^^^&nbsp;^^^&nbsp;^^^&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;<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;└——————93=可读写区段&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;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└———————————┴————0fffff+1=1MB&nbsp;(Limits)&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;<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;└—————————┴——12345678&nbsp;(Base)&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>它所代表的意思是如下图所示:(每组&nbsp;8&nbsp;byte)&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;┌——————————————————————┐&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Limit&nbsp;bit&nbsp;0-15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;0&nbsp;byte&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├——————————————————————┤&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;bit&nbsp;0-15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;2&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├——————————┬———————————┤&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存取权&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;bit&nbsp;16-23&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;4&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├——————————┼———————————┤&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7│&nbsp;&nbsp;&nbsp;Base&nbsp;bit&nbsp;24-31&nbsp;&nbsp;&nbsp;│G│..│limit&nbsp;bit&nbsp;16-19│&nbsp;6&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└——————————┴———————————┘&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;G&quot;代表&nbsp;Limit&nbsp;的单位是&nbsp;Byte&nbsp;或&nbsp;PAGE(4K)&nbsp;<BR>&nbsp;&nbsp;<BR>所以....&nbsp;<BR>&nbsp;&nbsp;<BR>#0000&nbsp;&nbsp;Segment&nbsp;not&nbsp;present.&nbsp;<BR>#0008&nbsp;&nbsp;Base=000B8000&nbsp;&nbsp;Limit=0000FFFF&nbsp;&nbsp;Flags=93&nbsp;&nbsp;USE32&nbsp;&nbsp;Byte&nbsp;granularity&nbsp;<BR>#0010&nbsp;&nbsp;Base=12345678&nbsp;&nbsp;Limit=000FFFFF&nbsp;&nbsp;Flags=93&nbsp;&nbsp;USE32&nbsp;&nbsp;Byte&nbsp;granularity&nbsp;<BR>^^^^^Selector&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;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>设定完後&nbsp;,就是切入保护模式&nbsp;,只要将&nbsp;CR0&nbsp;暂存器的&nbsp;Bit0&nbsp;设为&nbsp;'1'&nbsp;,再用一个&nbsp;<BR>跳越指令&nbsp;,就进入保护模式了。&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>---------------------------------------------------------------------------&nbsp;<BR>讲不懂没关系&nbsp;,现在来看看实例&nbsp;,这样比较容易懂..&nbsp;<BR>&nbsp;&nbsp;<BR>C:\&gt;386MICE&nbsp;SAMPLE.EXE&nbsp;<BR>-G&nbsp;1AE&nbsp;<BR>

⌨️ 快捷键说明

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