ospre/bootloader/boot/
mod.rs

1
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}