80386保护模式简介
【 80386保护模式简介 】在保护模式下有很多新的名词 ,包含 GDT.LDT.IDT 以及 CR0-CR3 ,笔者保护
模式并不清楚 ,所以底下资料可能有错误。这里使用大量的线性记忆体观念 ,请您
一定要从头往後看 ,否则很可能会看不懂 ,且必须懂线性记忆体计算方式。
【 GDT 介绍 】
在真实模式下每个区段都等於64K ,可是保护模式下每个区段的大小却是可变动
的 ,每个区段有多大呢 ,就是由 GDT 来决定。
您可以用 SGDT CS: 的方式将 GDT 的值读出 ,它的长度为 6 BYTE ,底下
是笔者写的小程式读出。
XXXX:0000FF 0F 00 20 C0 00
^^^^^^^^^^^GDT表所在的线性记忆体位址
^^^^^GDT表长度+1
将此表资料读出来.
X:00C02000 00 00 00 00 00 00 00 00-FF FF 00 A0 C2 9B 40 00 ........... B.@.
X:00C02010 FF FF B0 DD 01 93 40 00-FF FF E0 B3 00 9A 00 00 ..0]..@...`3....
X:00C02020 FF FF E0 B3 00 93 00 00-00 00 00 20 C1 82 80 00 ..`3....... A...
X:00C02030 00 00 00 20 C1 93 C0 00-00 00 00 20 C0 93 C0 00 ... A.@.... @.@.
X:00C02040 00 00 00 00 00 92 40 00-FF FF 00 80 0B 92 40 00 ......@.......@.
它所代表的意思是如下图所示∶(每组 8 byte)
┌──────────────────────┐
1│ Limit bit 0-15 │ 0 byte
├──────────────────────┤
3│ Base bit 0-15 │ 2
├──────────┬───────────┤
5│ 存取权 │ Base bit 16-23 │ 4
├──────────┼───────────┤
7│ Base bit 24-31 │G│..│limit bit 16-19│ 6
└──────────┴───────────┘
"G"代表 Limit 的单位是 Byte 或 PAGE(4K)
所以....
#0000Segment not present.
#0008Base=00C2A000Limit=0000FFFFFlags=9BUSE32Byte granularity
#0010Base=0001DDB0Limit=0000FFFFFlags=93USE32Byte granularity
#0018Base=0000B3E0Limit=0000FFFFFlags=9AUSE16Byte granularity
#0020Base=0000B3E0Limit=0000FFFFFlags=93USE16Byte granularity
#0028Base=00C12000Limit=00000000Flags=82 Page granularity
#0030Base=00C12000Limit=00000000Flags=93USE32Page granularity
#0038Base=00C02000Limit=00000000Flags=93USE32Page granularity
#0040Base=00000000Limit=00000000Flags=92USE32Byte granularity
#0048Base=000B8000Limit=0000FFFFFlags=92USE32Byte granularity
#0050Base=0001F56CLimit=000007FFFlags=92USE32Byte granularity
#0058Base=00000000Limit=00000144Flags=92USE32Page granularity
#0060Base=00000000Limit=00000144Flags=93USE32Page granularity
#0068Base=00127F48Limit=0000C32FFlags=9BUSE16Byte granularity
#0070Base=00134278Limit=000028F7Flags=93USE16Byte granularity
#0078Base=00000000Limit=00000000Flags=92USE16Byte granularity
^^^^^Selector ^^存取权
Base 就是指这个Secector:00000000对应到线性记忆体的何处 ,也就是说将线性记
忆体从 Base 所指的地方开始长度为 Limit ,剪下来变成一个独立的区段 ,如果您
在该区段想看超过 LIMIT 长度的记忆体 ,则会发生保护模式错误...应用程式可拦
截所发生的中断适当的加以处理。
注意 ,Limit的单位可以是 byte ,也可以是page(4k) ,由 "G" 是否为 1 来决定
至於 Selector 的数值我猜想应该是被标上 8 的倍数吧 ,因为很多书都是如此介
绍它。
--------------------------------------------------------------------------
【 LDT 介绍 】
上面介绍了 GDT 可以设定很多个Secector ,而 LDT 则是在这些被定义出来
的Selector中再切割出更小的单元。也就是说 LDT 的资料长度只有 2 BYTE ,这
个值直接就是指 Selector。
※这个命令必需在最高权力下才能执行 ,所以笔者使用 386DEBUG 来执行 ,在传
统 Real Mode/V86 都不能执行。
C:\>386debug 386debug.exp (改过的.exp档)
000C:0002743C 660F0007 SLDT
-T
-D EDI
0014:0000000028 00 <-- LDT 所指的Selector为0028
根据 GDT 的资料查表得到下表 ,但是由於 0028 这段落禁止观看 ,所以我改看0030
的段落 ,因为它的 Base 是一样的。
#0028Base=00C12000Limit=00000000Flags=82 Page granularity
#0030Base=00C12000Limit=00000000Flags=93USE32Page granularity
-D 30:0
0030:00000000FF 00 F0 CE 09 92 40 00-31 00 00 00 CA 9B C0 00 [email protected].@.
0030:0000001031 00 00 00 CA 93 C0 00-FF FF 00 80 0B 92 40 00 1...J.@.......@.
0030:00000020FF 00 F0 CE 09 92 40 00-4D 00 90 CE 09 92 40 00 [email protected]..@.
0030:0000003044 01 00 00 00 93 C0 00-00 00 00 00 00 92 40 00 D.....@.......@.
0030:00000040FF FF 00 80 0B 92 40 00-00 00 00 00 00 92 40 00 ......@.......@.
0030:0000005000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0030:0000006000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0030:0000007000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-DL 0
#0004Base=0009CEF0Limit=000000FFFlags=92USE32Byte granularity
#000CBase=00CA0000Limit=00000031Flags=9BUSE32Page granularity
#0014Base=00CA0000Limit=00000031Flags=93USE32Page granularity
#001CBase=000B8000Limit=0000FFFFFlags=92USE32Byte granularity
#0024Base=0009CEF0Limit=000000FFFlags=92USE32Byte granularity
#002CBase=0009CE90Limit=0000004DFlags=92USE32Byte granularity
#0034Base=00000000Limit=00000144Flags=93USE32Page granularity
#003CBase=00000000Limit=00000000Flags=92USE32Byte granularity
#0044Base=000B8000Limit=0000FFFFFlags=92USE32Byte granularity
#004CBase=00000000Limit=00000000Flags=92USE32Byte granularity
#0054Segment not present.
#005CSegment not present.
#0064Segment not present.
#006CSegment not present.
#0074Segment not present.
#007CSegment not present.
--------------------------------------------------------------------------
【 IDT 介绍 】
在以往中断向量表都是用 4 byte 来表示 ,但是在保护模式下则由 8 byte 表
示 ,至於那几个 byte 表示什麽 ,笔者还未搞懂 ,底下只弄懂几个。
C:\>386debug 386debug.exp (改过的.exp档)
000C:00027434 660F010F SIDT
-D EDI
0014:00000000FF 07 6C F5 01 00 .. ..-.. .. .. .. .. .. .. ..
^^^^^^^^^^^线性记忆体位址
^^^^^长+1
因为该线性记忆体已对映到 50:0
#0050Base=0001F56CLimit=000007FFFlags=92USE32Byte granularity
所以:
0050:0000000000 34 08 00 00 EE 00 00-0A 34 08 00 00 EE 00 00 .4...n...4...n..
0050:0000001014 34 08 00 00 EE 00 00-1E 34 08 00 00 EE 00 00 .4...n...4...n..
0050:0000002028 34 08 00 00 EE 00 00-32 34 08 00 00 EE 00 00 (4...n..24...n..
0050:000000303C 34 08 00 00 EE 00 00-6C 16 C8 0F 00 8E 00 00 <4...n..F4...n..
0050:0000004050 34 08 00 00 EE 00 00-5A 34 08 00 00 EE 00 00 P4...n..Z4...n..
0050:0000005064 34 08 00 00 EE 00 00-6E 34 08 00 00 EE 00 00 d4...n..n4...n..
0050:0000006078 34 08 00 00 EE 00 00-82 34 08 00 00 EE 00 00 x4...n...4...n..
0050:000000708C 34 08 00 00 EE 00 00-96 34 08 00 00 EE 00 00 .4...n...4...n..
-DI 0
#0000Selector=0008Offset=00003400Flags=EE ;int_0
#0001Selector=0008Offset=0000340AFlags=EE ;int_1
#0002Selector=0008Offset=00003414Flags=EE ;int_2
#0003Selector=0008Offset=0000341EFlags=EE ;int_3
#0004Selector=0008Offset=00003428Flags=EE
#0005Selector=0008Offset=00003432Flags=EE
#0006Selector=0008Offset=0000343CFlags=EE
#0007Selector=0FC8Offset=0000166CFlags=8E ;此处为Q387使用
#0008Selector=0008Offset=00003450Flags=EE
#0009Selector=0008Offset=0000345AFlags=EE
#000ASelector=0008Offset=00003464Flags=EE
#000BSelector=0008Offset=0000346EFlags=EE
#000CSelector=0008Offset=00003478Flags=EE
#000DSelector=0008Offset=00003482Flags=EE
#000ESelector=0008Offset=0000348CFlags=EE
#000FSelector=0008Offset=00003496Flags=EE
请仔
页:
[1]