ospre 0.1.6

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

pub fn equs()->&'static str{
    "
    
            ;该文件中定义了boot和loader程序中所用到的宏

        %ifndef _INFO_
        %define _INFO_

        LOADER_START_SECTOR equ 10      ;loader程序所在磁盘的起始扇区号
        LOADER_ALL_SECTORS  equ 90     ;loader程序总扇区数
        LOADER_CACHE_ADDRESS equ 0x7e00 ;loader程序被加载到内存缓冲区地址

        LOADER2_START_SECTOR equ 100      ;loader 64位部分程序所在磁盘的起始扇区号
        LOADER2_ALL_SECTORS  equ 100     ;loader 64位部分程序总扇区数
        LOADER2_CACHE_ADDRESS equ 0x100000 ;loader 64位部分程序被加载到内存缓冲区地址

        FOUR_PAGE_ADDRESS equ 0x200000                       ;临时4级头表位置
        THRER_PAGE_ADDRESS_FIRST equ 0x200000+0x1000         ;临时第一个页目录指针表位置
        TWO_PAGE_ADDRESS_FIRST equ 0x200000+0x1000+0x1000    ;临时第一个页目录表的位置

        KERNEL_START_SECTOR equ 200        ;内核程序所在磁盘的起始扇区号
        KERNEL_ALL_SECTORS  equ 19
        KERNEL_CACHE_ADDRESS equ 0xA00000  ;内核映像被加载到物理地址0xA00000处,线性地址10M处

        %endif

    
    
    "
}

pub fn lba28()->&'static str{
    "
    ;该文件封装了LBA28读取一个扇区的汇编过程

    %ifndef _LBA28_
    %define _LBA28_
    ;参数说明:eax为起始扇区号,ds:ebx为缓冲区地址
    read_one_sector:
        push eax
        push ebx
        push ecx
        push edx
        push esi
    
        mov esi,eax
    
        mov al,1
        mov dx,0x1f2   ;向端口0x1f2写入读取的扇区数
        out dx,al
    
        mov eax,esi
    
        inc dx
        out dx,al      ;向端口0x1f3写入起始扇区号0-7位
    
        inc dx
        shr eax,8
        out dx,al      ;向端口0x1f4写入起始扇区号8-15位
    
        inc dx
        shr eax,8
        out dx,al      ;向端口0x1f5写入起始扇区号16-23位
    
        inc dx
        shr eax,8
        or al,0xe0
        out dx,al      ;向端口0x1f6写入起始扇区号24-31位
    
        inc dx
        mov al,0x20
        out dx,al      ;向端口0x1f7写入磁盘读取命令0x20
    
    .waits:
        in al,dx
        and al,0x88
        cmp al,0x08
        jne .waits
    
        mov cx,256
        mov dx,0x1f0
    
    .read_word:
        in ax,dx       ;循环读取512字节
        mov [ebx],ax
        add ebx,2
        loop .read_word
    
        pop  esi
        pop  edx
        pop  ecx
        pop  ebx
        pop  eax
    
        ret
    
    
    %endif
    
    
    "
}