; 功能:boot程序的功能是开启保护模式,并加载loader ; Author: fengchen Xie ; Time:2023-04-20 %include "asm/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 "asm/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