原来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下全成乱码了,上面的注释都是我自己理解添加的,请多多指正。

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

posted on 2013-01-30 15:32  追寻前人的脚步  阅读(1117)  评论(0编辑  收藏  举报

导航