总所周知Web手除了Web啥都学
最近开了个新坑,在学Rust和OS,就在想为什么不结合起来rCore!
实验使用的文档为中山大学YatSenOS操作系统时间课程v2
引用实验文档中的实验说明
本文档提供了一套基于 Rust、面向 UEFI 和 x86_64 的操作系统课程实验方案。
本实验设计期望基于低汇编、避免重复造轮子的宗旨,利用 Rust 语言优秀的包管理和底层支持,借助现有的优秀工程化底层封装,为学生提供一个低负担、现代、面向高级语言的操作系统实验指南。
废话少说,直接开始干活
MacOS环境配置
实验支持使用MacOS with Apple Silicon,但是没有给出相应的配置方法(其实就是Linux:P)
1. 安装brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 安装qemu
brew install qemu
- 安装rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
QEMU启动UEFI Shell
初始化仓库、代码完整性等不再赘述,后续如有类似跳过部份不再提示,请以实验调试指南为准
测试qemu能否正常工作
qemu-system-x86_64 -bios ./assets/OVMF.fd -net none -nographic
跑起来了
BdsDxe: failed to load Boot0001 "UEFI QEMU DVD-ROM QM00003 " from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Secondary,Master,0x0): Not Found
BdsDxe: loading Boot0002 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
BdsDxe: starting Boot0002 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (EDK II, 0x00010000)
Mapping table
BLK0: Alias(s):
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell>
运行第一个UEFI程序
\#![no_std]
#![no_main]
#[macro_use]
extern crate log;
extern crate alloc;
use core::arch::asm;
use uefi::prelude::*;
#[entry]
fn efi_main(image: uefi::Handle, mut system_table: SystemTable<Boot>) -> Status {
uefi_services::init(&mut system_table).expect("Failed to initialize utilities");
log::set_max_level(log::LevelFilter::Info);
let std_num = "2021280167";
loop {
info!("Hello World from UEFI bootloader! @ {}", std_num);
for _ in 0..0x10000000 {
unsafe {
asm!("nop");
}
}
}
}
TODO:关于我在Mac按Control + A + X关不掉QEMU这件事(很奇怪,有点影响效率)
IDE我没有像教程使用VScode,而是采用了Jetbrain的RustRover但Preview版
我会针对RustRover改动一些配置以匹配我的开发习惯
也不知道以后有没有用,就先写着好了,相比于直接Build&Run我这里多了一步Check,电脑垃圾Build得慢