参考于渊的《自己动手写操作系统》第三章中从实模式切换到保护模式,最后有重新
切回实模式的代码(代码如下),其中有几点不太明白的,参考其他文章之后在此记录一下。
其中还有不太明白的地方,希望大家能在下面 留个言帮我讲明白,谢谢。
下面代码有些宏定义没贴出来,应该能看明白。
1
; ==========================================
2
; pmtest2.asm
3
; 编译方法:nasm pmtest2.asm -o pmtest2.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_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; ***注意此处为Normal 描述符*****
16
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 32
17
LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C ; 非一致代码段, 16
18
LABEL_DESC_DATA: Descriptor 0, DataLen - 1, DA_DRW ; Data
19
LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位
20
LABEL_DESC_TEST: Descriptor 0500000h, 0ffffh, DA_DRW
21
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
22
; GDT 结束
23
24
GdtLen equ $ - LABEL_GDT ; GDT长度
25
GdtPtr dw GdtLen - 1 ; GDT界限
26
dd 0 ; GDT基地址
27
28
; GDT 选择子
29
SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT
30
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
31
SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT
32
SelectorData equ LABEL_DESC_DATA - LABEL_GDT
33
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT
34
SelectorTest equ LABEL_DESC_TEST - LABEL_GDT
35
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
36
; END of [SECTION .gdt]
37
38
[SECTION .data1] ; 数据段
39
ALIGN 32
40
[BITS 32]
41
LABEL_DATA:
42
SPValueInRealMode dw 0
43
; 字符串
44
PMMessage: db "In Protect Mode now. ^-^", 0 ; 进入保护模式后显示此字符串
45
OffsetPMMessage equ PMMessage - $$ ; 字符串PMMessage相对于LABEL_DATA的偏移,相对于数据段的偏移
46
StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0
47
OffsetStrTest equ StrTest - $$
48
DataLen equ $ - LABEL_DATA
49
; END of [SECTION .data1]
50
; ==========================================2
; pmtest2.asm3
; 编译方法:nasm pmtest2.asm -o pmtest2.com4
; ==========================================5

6
%include "pm.inc" ; 常量, 宏, 以及一些说明7

8
org 0100h9
jmp LABEL_BEGIN10

11
[SECTION .gdt]12
; GDT13
; 段基址, 段界限 , 属性14
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符15
LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; ***注意此处为Normal 描述符*****16
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32 ; 非一致代码段, 3217
LABEL_DESC_CODE16: Descriptor 0, 0ffffh, DA_C ; 非一致代码段, 1618
LABEL_DESC_DATA: Descriptor 0, DataLen - 1, DA_DRW ; Data19
LABEL_DESC_STACK: Descriptor 0, TopOfStack, DA_DRWA + DA_32 ; Stack, 32 位20
LABEL_DESC_TEST: Descriptor 0500000h, 0ffffh, DA_DRW21
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址22
; GDT 结束23

24
GdtLen equ $ - LABEL_GDT ; GDT长度25
GdtPtr dw GdtLen - 1 ; GDT界限26
dd 0 ; GDT基地址27

28
; GDT 选择子29
SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT30
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT31
SelectorCode16 equ LABEL_DESC_CODE16 - LABEL_GDT32
SelectorData equ LABEL_DESC_DATA - LABEL_GDT33
SelectorStack equ LABEL_DESC_STACK - LABEL_GDT34
SelectorTest equ LABEL_DESC_TEST - LABEL_GDT35
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT36
; END of [SECTION .gdt]37

38
[SECTION .data1] ; 数据段39
ALIGN 3240
[BITS 32]41
LABEL_DATA:42
SPValueInRealMode dw 043
; 字符串44
PMMessage: db "In Protect Mode now. ^-^", 0 ; 进入保护模式后显示此字符串45
OffsetPMMessage equ PMMessage - $$ ; 字符串PMMessage相对于LABEL_DATA的偏移,相对于数据段的偏移 46
StrTest: db "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 047
OffsetStrTest equ StrTest - $$48
DataLen equ $ - LABEL_DATA49
; END of [SECTION .data1]50

本文介绍了一个基于《自己动手写操作系统》一书中的示例,实现从实模式切换到保护模式再返回实模式的过程。文中详细解释了相关代码,并对GDT(全局描述符表)的配置、描述符的作用及选择子的设定进行了说明。
4783

被折叠的 条评论
为什么被折叠?



