原来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下全成乱码了,上面的注释都是我自己理解添加的,请多多指正。
我也不知到说清楚没有……