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