想问一个关于操作系统实时模式切换到保护模式的问题,在哪个版块问啊
.MODEL SMALL
.386P
.STACK 800H
0000 .DATA
0008 DESC STRUC ; define descriptor structure
0000 0000 LIM_L DW 0
0002 0000 BAS_L DW 0
0004 00 BAS_M DB 0
0005 00 ACCESS DB 0
0006 00 LIM_M DB 0
0007 00 BAS_H DB 0
DESC ENDS
0068 TSS STRUC ; define TSS structure
0000 0000 BACK_L DW 0
0002 0000 DW 0
0004 00000000 ESP0 DD 0
0008 0000 SS0 DW 0
000A 0000 DW 0
000C 00000000 ESP1 DD 0
0010 0000 SS1 DW 0
0012 0000 DW 0
0014 00000000 ESP2 DD 0
0018 0000 SS2 DW 0
001A 0000 DW 0
001C 00000000 CCR3 DD 0
0020 00000000 EIP DD 0
0024 00000000 TFLAGS DD 0
0028 00000000 EEAX DD 0
002C 00000000 EECX DD 0
0030 00000000 EEDX DD 0
0034 00000000 EEBX DD 0
0038 00000000 EESP DD 0
003C 00000000 EEBP DD 0
0040 00000000 EEST DD 0
0044 00000000 EEDI DD 0
0048 0020 EES DW 20H
004A 0000 DW 0
004C 0018 ECS DW 18H
004E 0000 DW 0
0050 0020 ESS DW 20H
0052 0000 DW 0
0054 0020 EDS DW 20H
0056 0000 DW 0
0058 0020 EFS DW 20H
005A 0000 DW 0
005C 0020 EGS DW 20H
005E 0000 DW 0
0060 0000 ELDT DW 0
0062 0000 DW 0
0064 0000 DW 0
0066 0000 BITM DW 0
TSS ENDS
0000 0000 0000 TSS1 TSS <> ; task state 1
00000000
0000 0000 00000000
0000 0000 00000000
0000 0000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
0020 0000 0018
0000 0020 0000
0020 0000 0020
0000 0020 0000
0000 0000 0000
0000
0068 0000 0000 TSS2 TSS <> ; task state 2
00000000
0000 0000 00000000
0000 0000 00000000
0000 0000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
00000000 00000000
0020 0000 0018
0000 0020 0000
0020 0000 0020
0000 0020 0000
0000 0000 0000
0000
00D0 0040 [ IDT1 DD 64 DUP(?) ; space for 32 interrupt vectors
00000000
]
;
; Global descriptor table
;
01D0 0000 0000 00 GDT0 DESC <> ; clear null descripor
00 00 00
01D8 0000 0028 00 TG1 DESC <0, 28H, 0, 85H, 0, 0> ; task gate 1
85 00 00
01E0 0000 0030 00 TG2 DESC <0, 30H, 0, 85H, 0, 0> ; task gate 2
85 00 00
01E8 FFFF 0000 00 TCS DESC <-1, 0, 0, 9AH, 0CFH, 0> ; code segment (4G)
9A CF 00
01F0 FFFF 0000 00 DS1 DESC <-1, 0, 0, 92H, 0CFH, 0> ; data segment (4G)
92 CF 00
01F8 FFFF 0000 00 TS1 DESC <-1, 0, 0, 89H, 0CFH, 0> ; TSS1 available
89 CF 00
0200 FFFF 0000 00 TS2 DESC <-1, 0, 0, 89H, 0CFH, 0> ; TSS2 availble
89 CF 00
0208 2000 [ IOBP DB 2000H DUP(0) ; enable all I/O
00
]
;
; IDT table data
;
2208 00FF IDT DW 0FFH ; set limit to FFH
220A 00000000 IDTA DD 0
;
; GDT table data
;
220E 0017 GDT DW 17H ; set limit to 17H
2210 00000000 GDTA DD 0
0000 .CODE
MAK32 MACRO SEG, OFF ; make a seg + off a linear address
MOV EAX, 0
MOV EBX, 0
MOV AX, SEG
MOV BX, OFF
SHL EAX, 4
ADD EAX, EBX
ENDM
MAKD MACRO TSS, DES ; save base address
PUSH EAX
MOV EBX, 0
MOV BX, OFFSET TSS
ADD EAX, EBX
MOV DES.BAS_L, AX
SHR EAX, 16
MOV DES.BAS_M, AL
MOV DES.BAS_H, AH
POP EAX
ENDM
.STARTUP
MAK32 DS, OFFSET IDT1
0028 66| A3 220A R MOV IDTA, EAX ; save IDT address
MAK32 DS, OFFSET GDT0
0044 66| A3 2210 R MOV GDTA, EAX ; save GDT address
0048 B9 0020 MOV CX, 32
004B BF 00D0 R MOV DI, OFFSET IDT1
004E BE 0000 MOV SI, 0
0051 B8 0000 MOV AX, 0
0054 8E C0 MOV ES, AX
.REPEAT ; setup first 32 interrupt
MAK32 ES:[SI+2], ES:[SI]
0070 89 05 MOV [DI], AX
0072 66| C1 E8 10 SHR EAX, 16
0076 89 45 06 MOV [DI+6], AX
0079 C7 45 02 0008 MOV WORD PTR [DI+2], 8
007E C7 45 04 8F00 MOV WORD PTR [DI+4], 8F00H
0083 83 C7 08 ADD DI, 8
0086 83 C6 04 ADD SI, 4
.UNTILCXZ
008B B8 0208 R MOV AX, OFFSET IOBP ; setup I/O bit map
008E A3 0066 R MOV TSS1.BITM, AX
0091 A3 00CE R MOV TSS2.BITM, AX
MAK32 CS, OFFSET TASK1 ; get task1 address
00AC 66| A3 0088 R MOV TSS2.EIP, EAX ; save it in task2
MAKD TSS1, TS1
MAKD TSS2, TS2
00EC 0F 01 1E 2208 R LIDT WORD PTR IDT ; load IDT
00F1 0F 01 16 220E R LGDT FWORD PTR GDT ; load GDT
00F6 0F 20 C0 MOV EAX, CR0 ; set PE
00F9 66| 83 C8 01 OR EAX, 1
00FD 0F 22 C0 MOV CR0, EAX
0100 EB 00 JMP START ; near jump
0102 START:
0102 B8 0008 MOV AX, 8 ; address TSS1
0105 0F 00 D8 LTR AX
0108 B8 0010 MOV AX, 10H
010B FF E0 JMP AX
; now in protected mode at task1.
010D TASK1:
END