ospre 0.1.6

这是一个用于开发64位操作系统的前置工具,用于做boot、loader等工作。它需要你安装nasm编译器才能使用,使用方式请看文档
Documentation

; 功能: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