📄 00000000.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>section 1 of 1 of file protect.zip <BR> <BR> <BR> ┌┐┌┐∞ <BR> 【 80386保护模式简介 】 ┘└┘└┘ <BR> <BR>-------------------------------------------------------------------------- <BR> 在保护模式下有很多新的名词 ,包含 GDT.LDT.IDT 以及 CR0-CR3 ,笔者对保护 <BR>模式并不清楚 ,所以底下资料可能有错误。这里使用大量的线性记忆体观念 ,请您 <BR>一定要从头往後看 ,否则很可能会看不懂 ,且必须懂线性记忆体计算方式。 <BR> <BR>-------------------------------------------------------------------------- <BR>【 GDT 介绍 】 <BR> 在真实模式下每个区段都等於64K ,可是保护模式下每个区段的大小却是可变动 <BR>的 ,每个区段有多大呢 ,就是由 GDT 来决定。 <BR> <BR> <BR> 您可以用 SGDT CS:[BX] 的方式将 GDT 的值读出 ,它的长度为 6 BYTE ,底下 <BR> 是笔者写的小程式读出。 <BR> <BR> XXXX:0000 FF 0F 00 20 C0 00 <BR> ^^^^^^^^^^^GDT表所在的线性记忆体位址 <BR> ^^^^^GDT表长度+1 <BR> <BR>将此表资料读出来. <BR>X:00C02000 00 00 00 00 00 00 00 00-FF FF 00 A0 C2 9B 40 00 ........... <A HREF="mailto:B.@.">B.@.</A> <BR>X:00C02010 FF FF B0 DD 01 93 40 00-FF FF E0 B3 00 9A 00 00 ..0]<A HREF="mailto:..@...`3....">..@...`3....</A> <BR>X:00C02020 FF FF E0 B3 00 93 00 00-00 00 00 20 C1 82 80 00 ..`3....... A... <BR>X:00C02030 00 00 00 20 C1 93 C0 00-00 00 00 20 C0 93 C0 00 ... <A HREF="mailto:A.@....">A.@....</A> <A HREF="mailto:@.@.">@.@.</A> <BR>X:00C02040 00 00 00 00 00 92 40 00-FF FF 00 80 0B 92 40 00 <A HREF="mailto:......@.......@.">......@.......@.</A> <BR> . <BR> . <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=00C2A000 Limit=0000FFFF Flags=9B USE32 Byte granularity <BR>#0010 Base=0001DDB0 Limit=0000FFFF Flags=93 USE32 Byte granularity <BR>#0018 Base=0000B3E0 Limit=0000FFFF Flags=9A USE16 Byte granularity <BR>#0020 Base=0000B3E0 Limit=0000FFFF Flags=93 USE16 Byte granularity <BR>#0028 Base=00C12000 Limit=00000000 Flags=82 Page granularity <BR>#0030 Base=00C12000 Limit=00000000 Flags=93 USE32 Page granularity <BR>#0038 Base=00C02000 Limit=00000000 Flags=93 USE32 Page granularity <BR>#0040 Base=00000000 Limit=00000000 Flags=92 USE32 Byte granularity <BR>#0048 Base=000B8000 Limit=0000FFFF Flags=92 USE32 Byte granularity <BR>#0050 Base=0001F56C Limit=000007FF Flags=92 USE32 Byte granularity <BR>#0058 Base=00000000 Limit=00000144 Flags=92 USE32 Page granularity <BR>#0060 Base=00000000 Limit=00000144 Flags=93 USE32 Page granularity <BR>#0068 Base=00127F48 Limit=0000C32F Flags=9B USE16 Byte granularity <BR>#0070 Base=00134278 Limit=000028F7 Flags=93 USE16 Byte granularity <BR>#0078 Base=00000000 Limit=00000000 Flags=92 USE16 Byte granularity <BR>^^^^^Selector ^^存取权 <BR> <BR>Base 就是指这个Secector:00000000对应到线性记忆体的何处 ,也就是说将线性记 <BR>忆体从 Base 所指的地方开始长度为 Limit ,剪下来变成一个独立的区段 ,如果您 <BR>在该区段想看超过 LIMIT 长度的记忆体 ,则会发生保护模式错误...应用程式可拦 <BR>截所发生的中断适当的加以处理。 <BR>注意 ,Limit的单位可以是 byte ,也可以是page(4k) ,由 "G" 是否为 1 来决定 <BR> <BR>至於 Selector 的数值我猜想应该是被标上 8 的倍数吧 ,因为很多书都是如此介 <BR>绍它。 <BR> <BR>-------------------------------------------------------------------------- <BR>【 LDT 介绍 】 <BR> 上面介绍了 GDT 可以设定很多个Secector ,而 LDT 则是在这些被定义出来 <BR>的Selector中再切割出更小的单元。也就是说 LDT 的资料长度只有 2 BYTE ,这 <BR>个值直接就是指 Selector。 <BR> <BR>※这个命令必需在最高权力下才能执行 ,所以笔者使用 386DEBUG 来执行 ,在传 <BR> 统 Real Mode/V86 都不能执行。 <BR> <BR>C:\>386debug 386debug.exp (改过的.exp档) <BR>000C:0002743C 660F0007 SLDT [EDI] <BR>-T <BR>-D EDI <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -