pub fn boot()->&'static str{
"
; 功能:boot程序的功能是开启保护模式,并加载loader
; Author: fengchen Xie
; Time:2023-04-20
%include \"ospre/common/boot_loader_equ.asm\"
[bits 16]
org 0x7c00
section boot
; 设置寄存器和栈
mov ax, 0x0000
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
cli
;加载GDT
mov word [GDT_LIMIT],31
mov dword [GDT_LIMIT+0x02],GDT
lgdt [GDT_LIMIT]
;定位保护模式入口点
mov dword [PROTECT_ENTRY+0x00],protect
mov dword [PROTECT_ENTRY+0x04],0x08
;开启保护模式
mov eax,cr0
or eax,1
mov cr0,eax
;使用jmp指令刷新流水线
jmp far dword [PROTECT_ENTRY]
[bits 32]
;进入保护模式
protect:
;初始化各个段寄存器
mov eax,0x10
mov ds,eax
mov es,eax
mov ss,eax
mov esp,0x7c00
;从磁盘循环读取loader到内存0x7e00处
mov ecx,LOADER_ALL_SECTORS
mov eax,LOADER_START_SECTOR
mov ebx,LOADER_CACHE_ADDRESS
read_loader:
call read_one_sector
add ebx,0x200
loop read_loader ;调用存储在LBA28文件中的读取磁盘过程
jmp LOADER_CACHE_ADDRESS ;跳转到loader程序位置执行
%include \"ospre/common/LBA28.asm\"
;-----------------------------------------------以下位置存放数据--------------------------------------------------
;GDT段界限和基地址
GDT_LIMIT:
dw 0x00
dd 0x00
;GDT所在位置
GDT:
;空描述符
dd 0x00000000
dd 0x00000000
;代码段描述符
dd 0x0000ffff
dd 0x00cf9a00
;数据段描述符
dd 0x0000ffff
dd 0x00cf9200
;64位代码段描述符(方便在进入64位模式时使用)
dd 0x0000ffff
dd 0x00af9800
PROTECT_ENTRY:
;保护模式入口
dd 0x00
dd 0x00
; 引导扇区魔术
times 510-($-$$) db 0
db 0x55
db 0xaa
"
}