原来gdt和gdtr可以这么得来

原来看得都是赵博的书,讲的很详细,理论性很强,最近想动手实践下,看《自己动手写操作系统》第三章的一个例子,突然发现gdt和gdtr可以这么得来

赵博的书上,这两个东西是直接设定好的(一直认为也要这么做)。

今天就来说下,《自己动手写操作系统》这本书是怎么实现的

我主要说gdt和gdtr其他的都简单

 1 ; ==========================================

 2 ; pmtest1.asm

 3 ; ±àÒë·œ·š£ºnasm pmtest1.asm -o pmtest1.com

 4 ; ==========================================

 5 

 6 %include    "pm.inc"    ; 

 7 

 8 org    0100h

 9     jmp    LABEL_BEGIN

10 

11 [SECTION .gdt]

12 ; GDT

13 ;                                        

14 LABEL_GDT:        Descriptor           0,                0, 0             ; 

15 LABEL_DESC_CODE32:    Descriptor           0, SegCode32Len - 1, DA_C + DA_32    ; 

16 LABEL_DESC_VIDEO:    Descriptor     0B8000h,           0ffffh, DA_DRW        ;

17 ; GDT œáÊø

18 

19 GdtLen        equ    $ - LABEL_GDT    ; 

20 GdtPtr        dw    GdtLen - 1    ; 

21         dd    0        ; GDT»ùµØÖ·

22 

23 ; GDT Ñ¡Ôñ×Ó

24 SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDT

25 SelectorVideo        equ    LABEL_DESC_VIDEO    - LABEL_GDT

26 ; END of [SECTION .gdt]

27 

28 [SECTION .s16]

29 [BITS    16]

30 LABEL_BEGIN:

31     mov    ax, cs

32     mov    ds, ax

33     mov    es, ax

34     mov    ss, ax

35     mov    sp, 0100h

36 

37     ; 这段的意思好好看看,在实模式下把代码段的物理地址求出来(左移四位加偏移),把这个物理地址保存在描述符中(这是我在赵博的书上没有见到过的),留着在实模式的时候用38     xor    eax, eax

39     mov    ax, cs

40     shl    eax, 4

41     add    eax, LABEL_SEG_CODE32

42     mov    word [LABEL_DESC_CODE32 + 2], ax;这里我建议最好看看全局描述符的2,3,4,7字节都表示的是什么意思

43     shr    eax, 16

44     mov    byte [LABEL_DESC_CODE32 + 4], al

45     mov    byte [LABEL_DESC_CODE32 + 7], ah

46 

47     ; 这里同上,再实模式下求出要加载到gdtr里的地址,保存下来,到实模式的时候用

48     xor    eax, eax

49     mov    ax, ds

50     shl    eax, 4

51     add    eax, LABEL_GDT        ; 52     mov    dword [GdtPtr + 2], eax    ;53 

54 55     lgdt    [GdtPtr]

56 

57 58     cli

59 

60 61     in    al, 92h

62     or    al, 00000010b

63     out    92h, al

64 

65 66     mov    eax, cr0

67     or    eax, 1

68     mov    cr0, eax

69 

70 71     jmp    dword SelectorCode32:0    ; 72 ; END of [SECTION .s16]

73 

74 

75 [SECTION .s32];76 [BITS    32]

77 

78 LABEL_SEG_CODE32:

79     mov    ax, SelectorVideo

80     mov    gs, ax            

81 

82     mov    edi, (80 * 10 + 0) * 2   83     mov    ah, 0Ch            ;84     mov    al, 'P'

85     mov    [gs:edi], ax

86 

87 88     jmp    $

89 

90 SegCode32Len    equ    $ - LABEL_SEG_CODE32

91 ; END of [SECTION .s32]

本来源代码上是有注释的,在linux下全成乱码了,上面的注释都是我自己理解添加的,请多多指正。

我也不知到说清楚没有……

你可能感兴趣的:(tr)