-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboot.inc
63 lines (55 loc) · 2.22 KB
/
boot.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;---------------------------loader和kernel-------------
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2
PAGE_DIR_TABLE_POS equ 0x100000
KERNEL_START_SECTOR equ 0x9
KERNEL_BIN_BASE_ADDR equ 0x70000
KERNEL_ENTRY_POINT equ 0xc0001500
; gdt描述符属性
; 段描述符高23位,表示段界限的粒度为4KB
DESC_G_4K equ 100000000000000000000000b
; D/B为,1表示运行在32位模式下
DESC_D_32 equ 10000000000000000000000b
; 高21位,如果为1表示为64位代码段,目前我们都是在32位模式下操作,故为零
DESC_L equ 0000000000000000000000b
; 没有明确的用途,取值随意
DESC_AVL equ 000000000000000000000b
; 第二部分段界限值,由于采用了32位平坦模型,所以段界限为(4GB / 4KB) - 1 = 0xFFFFF,故为全1
DESC_LIMIT_CODE2 equ 11110000000000000000b
DESC_LIMIT_DATA2 equ DESC_LIMIT_CODE2
; 书中取全零,怀疑是错误的,因为保护模式的基地址是0xb8000,所以最后8位应该是b,而不是0
DESC_LIMIT_VIDEO2 equ 00000000000000000000000000001011b
DESC_P equ 1000000000000000b
DESC_DPL_0 equ 000000000000000b
DESC_DPL_1 equ 010000000000000b
DESC_DPL_2 equ 100000000000000b
DESC_DPL_3 equ 110000000000000b
DESC_S_CODE equ 1000000000000b
DESC_S_DATA equ DESC_S_CODE
DESC_S_sys equ 0000000000000b
DESC_TYPE_CODE equ 100000000000b
DESC_TYPE_DATA equ 001000000000b
; 代码段描述符的高32位表示,其中(0x00 << 24表示最高8位的段基址值,由于我们采用的是平坦模型,故基址为零),后面唯一可变的就是段界限值
DESC_CODE_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + \
DESC_P + DESC_DPL_0 + DESC_S_CODE + DESC_TYPE_CODE + 0x00
DESC_DATA_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
DESC_L + DESC_AVL + DESC_LIMIT_DATA2 + \
DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00
DESC_VIDEO_HIGH4 equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + \
DESC_P + DESC_DPL_0 + DESC_S_DATA + DESC_TYPE_DATA + 0x00
; 选择字属性
RPL0 equ 00b
RPL1 equ 01b
RPL2 equ 10b
RPL3 equ 11b
TI_GDT equ 000b
TI_LDT equ 100b
; 页表相关属性
PG_P equ 1b
PG_RW_R equ 00b
PG_RW_W equ 10b
PG_US_S equ 000b
PG_US_U equ 100b
PT_NULL equ 0