阅读:1487回复:3
想问一个关于操作系统实时模式切换到保护模式的问题,在哪个版块问啊.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 ============================================================================================== 上面的代码是实时模式转保护模式的代码,有个地方看不明白,请大虾们赐教 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 上面的代码有点看不懂, MAK32 CS, OFFSET TASK1 取得了TASK1的开始地址,保存在TSS2.EIP了,可下面的代码 MAKD TSS1, TS1 又把这个地址与TSS的起始地址相加,做为基址,这是什么意思啊?! ================================================================================================ QQ21915345,请赐教,谢谢! ================================================================================================ 你说的我也知道,不过我看代码有点问题,麻烦您再给看看 MAK32 CS, OFFSET TASK1 ; get task1 address 00AC 66| A3 0088 R MOV TSS2.EIP, EAX ; save it in task2 此时,EAX保存了任务TASK1的指令执行地址,可下面的代码中,MAKD宏把 EAX 和 TSS 的偏移地址相加做为 TSS 的基址,这样子正确吗? MAKD TSS1, TS1 MAKD TSS2, TS2 引用 4 楼 cnzdgs 的回复:前者是该任务的eip,告诉处理器该任务从哪里开始执行。后者是TSS对应的描述符,处理器要根据这个描述符来找到TSS。 ================================================================================================= |
|
沙发#
发布于:2010-03-08 17:05
???!!!???
大牛们都在哪里啊? |
|
板凳#
发布于:2010-03-08 17:07
???!!!???
大牛们都在哪里呀? |
|
地板#
发布于:2010-03-09 10:06
???!!!???
大牛们都在哪里呀? |
|