ospre 0.1.6

这是一个用于开发64位操作系统的前置工具,用于做boot、loader等工作。它需要你安装nasm编译器才能使用,使用方式请看文档
Documentation
#![allow(unused)]
use std::fs;
use std::collections::HashMap;
use ospre::util;
use ospre::compile::compile;
use ospre::makedisk::make;
use ospre::bootloader;
use std::env;

fn main(){

    //0.发生panic时删除临时文件
    std::panic::set_hook(Box::new(my_panic_hook));


    //1.获取内核文件所在路径
    let os_path=util::analyze_kernel_path();
    if os_path==""{
        panic!("请在命令行传入内核程序路径,例如: kernel=kernel_file_path/kernel.elf")
    }

    //2.创建临时文件boot.asm loader.asm loader2.asm
    if let Err(e)=create_batch(){
        panic!("创建临时文件失败:{:?}",e);
    };

    //3.编译
    compile(os_path.as_str());

    //4.制作镜像
    make_image(os_path.as_str());

    //5.删除临时文件
   if let Err(e)=fs::remove_dir_all("ospre"){
    panic!("删除临时文件失败{}",e);
   }
}



fn create_batch()->std::io::Result<()>{
    fs::create_dir("ospre")?;
    fs::create_dir("ospre/bin")?;
    fs::create_dir("ospre/boot")?;
    fs::create_dir("ospre/loader")?;
    fs::create_dir("ospre/common")?;

    let boot_asm="ospre/boot/boot.asm";
    let loader_asm="ospre/loader/loader.asm";
    let loader2_asm="ospre/loader/loader2.asm";
    let boot_loader_equ="ospre/common/boot_loader_equ.asm";
    let lba28="ospre/common/LBA28.asm";

    util::create_tmp_file(boot_asm,bootloader::boot::boot());
    util::create_tmp_file(loader_asm,bootloader::loader::loader());
    util::create_tmp_file(loader2_asm,bootloader::loader::loader2());
    util::create_tmp_file(boot_loader_equ,bootloader::common::equs());
    util::create_tmp_file(lba28,bootloader::common::lba28());

    Ok(())
}

fn make_image(os_path:&str)->std::io::Result<()>{
    let boot_bin="ospre/bin/boot.bin";
    let loader_bin="ospre/bin/loader.bin";
    let loader2_bin="ospre/bin/loader2.bin";

    let mut file_block:HashMap<&str, u64> = HashMap::new();  //key是文件路径,v是文件的起始扇区号
    file_block.insert(boot_bin,0);
    file_block.insert(loader_bin,10);
    file_block.insert(loader2_bin,100);
    file_block.insert(os_path,200);

    make(&file_block)?;
    Ok(())
}

fn my_panic_hook(info: &std::panic::PanicInfo<'_>) {
    println!("\x1b[31m{}\x1b[0m","发生错误:");
    println!("\x1b[31m{}\x1b[0m", info);
    fs::remove_dir_all("ospre");
    std::process::exit(0);
}