niceboy
驱动牛犊
驱动牛犊
  • 注册日期2003-04-23
  • 最后登录2010-03-12
  • 粉丝0
  • 关注0
  • 积分107分
  • 威望103点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:2092回复:2

想问一个关于操作系统实时模式切换到保护模式的问题,在哪个版块问啊

楼主#
更多 发布于:2010-03-08 10:31

        .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。
=================================================================================================

cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2010-03-08 14:48
linux操作系统就在这个板块
走走看看开源好 Solaris vs Linux
niceboy
驱动牛犊
驱动牛犊
  • 注册日期2003-04-23
  • 最后登录2010-03-12
  • 粉丝0
  • 关注0
  • 积分107分
  • 威望103点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-03-08 14:59
楼上正解
游客

返回顶部