ospre/bootloader/boot/
mod.rs1
2pub fn boot()->&'static str{
3
4 "
5 ; 功能:boot程序的功能是开启保护模式,并加载loader
6 ; Author: fengchen Xie
7 ; Time:2023-04-20
8
9 %include \"ospre/common/boot_loader_equ.asm\"
10
11 [bits 16]
12 org 0x7c00
13 section boot
14 ; 设置寄存器和栈
15 mov ax, 0x0000
16 mov ds, ax
17 mov es, ax
18 mov ss, ax
19 mov sp, 0x7c00
20
21 cli
22 ;加载GDT
23 mov word [GDT_LIMIT],31
24 mov dword [GDT_LIMIT+0x02],GDT
25 lgdt [GDT_LIMIT]
26
27 ;定位保护模式入口点
28 mov dword [PROTECT_ENTRY+0x00],protect
29 mov dword [PROTECT_ENTRY+0x04],0x08
30
31 ;开启保护模式
32 mov eax,cr0
33 or eax,1
34 mov cr0,eax
35
36 ;使用jmp指令刷新流水线
37 jmp far dword [PROTECT_ENTRY]
38
39 [bits 32]
40 ;进入保护模式
41 protect:
42 ;初始化各个段寄存器
43 mov eax,0x10
44 mov ds,eax
45 mov es,eax
46 mov ss,eax
47 mov esp,0x7c00
48
49 ;从磁盘循环读取loader到内存0x7e00处
50 mov ecx,LOADER_ALL_SECTORS
51 mov eax,LOADER_START_SECTOR
52 mov ebx,LOADER_CACHE_ADDRESS
53
54
55 read_loader:
56 call read_one_sector
57 add ebx,0x200
58 loop read_loader ;调用存储在LBA28文件中的读取磁盘过程
59
60 jmp LOADER_CACHE_ADDRESS ;跳转到loader程序位置执行
61
62
63 %include \"ospre/common/LBA28.asm\"
64
65
66
67
68
69 ;-----------------------------------------------以下位置存放数据--------------------------------------------------
70 ;GDT段界限和基地址
71 GDT_LIMIT:
72 dw 0x00
73 dd 0x00
74
75
76 ;GDT所在位置
77 GDT:
78 ;空描述符
79 dd 0x00000000
80 dd 0x00000000
81
82 ;代码段描述符
83 dd 0x0000ffff
84 dd 0x00cf9a00
85
86 ;数据段描述符
87 dd 0x0000ffff
88 dd 0x00cf9200
89
90 ;64位代码段描述符(方便在进入64位模式时使用)
91 dd 0x0000ffff
92 dd 0x00af9800
93 PROTECT_ENTRY:
94 ;保护模式入口
95 dd 0x00
96 dd 0x00
97
98 ; 引导扇区魔术
99 times 510-($-$$) db 0
100 db 0x55
101 db 0xaa
102
103 "
104}