80386保護模式簡介(轉)

post0發表於2007-08-14
80386保護模式簡介(轉)[@more@]

  在保護模式下有很多新的名詞 ,包含 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   

  根據 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 ..pN..@.1...J.@.

  

  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 ..pN..@.M..N..@.

  

  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 0


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-957201/,如需轉載,請註明出處,否則將追究法律責任。

相關文章