QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1409|回复: 0

80386保护模式简介

[复制链接]
发表于 2003-5-14 07:53:53 | 显示全部楼层 |阅读模式
【 80386保护模式简介 】                  
    在保护模式下有很多新的名词 ,包含 GDT.LDT.IDT 以及 CR0-CR3 ,笔者保护

模式并不清楚 ,所以底下资料可能有错误。这里使用大量的线性记忆体观念 ,请您

一定要从头往後看 ,否则很可能会看不懂 ,且必须懂线性记忆体计算方式。

【 GDT 介绍 】

    在真实模式下每个区段都等於64K ,可是保护模式下每个区段的大小却是可变动

的 ,每个区段有多大呢 ,就是由 GDT 来决定。
   您可以用 SGDT CS:[BX] 的方式将 GDT 的值读出 ,它的长度为 6 BYTE ,底下

    是笔者写的小程式读出。



    XXXX:0000  FF 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)



所以....



#0000  Segment not present.

#0008  Base=00C2A000  Limit=0000FFFF  Flags=9B  USE32  Byte granularity

#0010  Base=0001DDB0  Limit=0000FFFF  Flags=93  USE32  Byte granularity

#0018  Base=0000B3E0  Limit=0000FFFF  Flags=9A  USE16  Byte granularity

#0020  Base=0000B3E0  Limit=0000FFFF  Flags=93  USE16  Byte granularity

#0028  Base=00C12000  Limit=00000000  Flags=82         Page granularity

#0030  Base=00C12000  Limit=00000000  Flags=93  USE32  Page granularity

#0038  Base=00C02000  Limit=00000000  Flags=93  USE32  Page granularity

#0040  Base=00000000  Limit=00000000  Flags=92  USE32  Byte granularity

#0048  Base=000B8000  Limit=0000FFFF  Flags=92  USE32  Byte granularity

#0050  Base=0001F56C  Limit=000007FF  Flags=92  USE32  Byte granularity

#0058  Base=00000000  Limit=00000144  Flags=92  USE32  Page granularity

#0060  Base=00000000  Limit=00000144  Flags=93  USE32  Page granularity

#0068  Base=00127F48  Limit=0000C32F  Flags=9B  USE16  Byte granularity

#0070  Base=00134278  Limit=000028F7  Flags=93  USE16  Byte granularity

#0078  Base=00000000  Limit=00000000  Flags=92  USE16  Byte 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     [EDI]

-T

-D EDI

0014:00000000  28 00                    <-- LDT 所指的Selector为0028

根据 GDT 的资料查表得到下表 ,但是由於 0028 这段落禁止观看 ,所以我改看0030

的段落 ,因为它的 Base 是一样的。



#0028  Base=00C12000  Limit=00000000  Flags=82         Page granularity

#0030  Base=00C12000  Limit=00000000  Flags=93  USE32  Page granularity



-D 30:0

0030:00000000  FF 00 F0 CE 09 92 40 00-31 00 00 00 CA 9B C0 00 [email protected].@.

0030:00000010  31 00 00 00 CA 93 C0 00-FF FF 00 80 0B 92 40 00 1...J.@.......@.

0030:00000020  FF 00 F0 CE 09 92 40 00-4D 00 90 CE 09 92 40 00 [email protected]..@.

0030:00000030  44 01 00 00 00 93 C0 00-00 00 00 00 00 92 40 00 D.....@.......@.

0030:00000040  FF FF 00 80 0B 92 40 00-00 00 00 00 00 92 40 00 ......@.......@.

0030:00000050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0030:00000060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0030:00000070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................



-DL 0

#0004  Base=0009CEF0  Limit=000000FF  Flags=92  USE32  Byte granularity

#000C  Base=00CA0000  Limit=00000031  Flags=9B  USE32  Page granularity

#0014  Base=00CA0000  Limit=00000031  Flags=93  USE32  Page granularity

#001C  Base=000B8000  Limit=0000FFFF  Flags=92  USE32  Byte granularity

#0024  Base=0009CEF0  Limit=000000FF  Flags=92  USE32  Byte granularity

#002C  Base=0009CE90  Limit=0000004D  Flags=92  USE32  Byte granularity

#0034  Base=00000000  Limit=00000144  Flags=93  USE32  Page granularity

#003C  Base=00000000  Limit=00000000  Flags=92  USE32  Byte granularity

#0044  Base=000B8000  Limit=0000FFFF  Flags=92  USE32  Byte granularity

#004C  Base=00000000  Limit=00000000  Flags=92  USE32  Byte granularity

#0054  Segment not present.

#005C  Segment not present.

#0064  Segment not present.

#006C  Segment not present.

#0074  Segment not present.

#007C  Segment not present.



--------------------------------------------------------------------------

【 IDT 介绍 】

    在以往中断向量表都是用 4 byte 来表示 ,但是在保护模式下则由 8 byte 表

示 ,至於那几个 byte 表示什麽 ,笔者还未搞懂 ,底下只弄懂几个。





C:\>386debug 386debug.exp   (改过的.exp档)

000C:00027434 660F010F                 SIDT     [EDI]

-D EDI

0014:00000000  FF 07 6C F5 01 00 .. ..-.. .. .. .. .. .. .. ..

                     ^^^^^^^^^^^线性记忆体位址

               ^^^^^长+1

因为该线性记忆体已对映到 50:0

#0050  Base=0001F56C  Limit=000007FF  Flags=92  USE32  Byte granularity

所以:

0050:00000000  00 34 08 00 00 EE 00 00-0A 34 08 00 00 EE 00 00 .4...n...4...n..

0050:00000010  14 34 08 00 00 EE 00 00-1E 34 08 00 00 EE 00 00 .4...n...4...n..

0050:00000020  28 34 08 00 00 EE 00 00-32 34 08 00 00 EE 00 00 (4...n..24...n..

0050:00000030  3C 34 08 00 00 EE 00 00-6C 16 C8 0F 00 8E 00 00 <4...n..F4...n..

0050:00000040  50 34 08 00 00 EE 00 00-5A 34 08 00 00 EE 00 00 P4...n..Z4...n..

0050:00000050  64 34 08 00 00 EE 00 00-6E 34 08 00 00 EE 00 00 d4...n..n4...n..

0050:00000060  78 34 08 00 00 EE 00 00-82 34 08 00 00 EE 00 00 x4...n...4...n..

0050:00000070  8C 34 08 00 00 EE 00 00-96 34 08 00 00 EE 00 00 .4...n...4...n..



-DI 0

#0000  Selector=0008  Offset=00003400  Flags=EE         ;int_0

#0001  Selector=0008  Offset=0000340A  Flags=EE         ;int_1

#0002  Selector=0008  Offset=00003414  Flags=EE         ;int_2

#0003  Selector=0008  Offset=0000341E  Flags=EE         ;int_3

#0004  Selector=0008  Offset=00003428  Flags=EE

#0005  Selector=0008  Offset=00003432  Flags=EE

#0006  Selector=0008  Offset=0000343C  Flags=EE

#0007  Selector=0FC8  Offset=0000166C  Flags=8E         ;此处为Q387使用

#0008  Selector=0008  Offset=00003450  Flags=EE

#0009  Selector=0008  Offset=0000345A  Flags=EE

#000A  Selector=0008  Offset=00003464  Flags=EE

#000B  Selector=0008  Offset=0000346E  Flags=EE

#000C  Selector=0008  Offset=00003478  Flags=EE

#000D  Selector=0008  Offset=00003482  Flags=EE

#000E  Selector=0008  Offset=0000348C  Flags=EE

#000F  Selector=0008  Offset=00003496  Flags=EE



请仔
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 07:04 , Processed in 0.058196 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表