初めに
この記事では、最終的にWriting OS in RustとゼロからのOS自作入門を合体したようなOSが出来ることを目標としています。私は対してRustに詳しいわけでもOSに詳しいわけでもないただ面白そうというだけで来た人間なので理解がガバガバな面もあると思うので変なことを言っていたらコメントいただけると助かります。(失踪しないよう頑張ります)
Writing OS in Rust
1. UEFIブートへの対応
今回、Writing OS in Rustで使用していたbootloaderがバージョンアップによりUEFIブートに対応したとのことなので、これを利用したいと思う。
参考サイト群
やったこと
今回、ディスクイメージ作成の項を読み我々が作成してきたosカーネルをサブプロジェクトに移し、新しく作成したプロジェクトからカーネルをコンパイル、qemuの起動を行う形式に移行した。
よくわからんエラー対処
error[E0658]: use of unstable library feature 'proc_macro_byte_character'
=> rustup update
一応qemuを実行することに成功はしたが、割り込みハンドラの扱いが変わっているため、どこかでエラーが発生し、色々あってトリプルフォルトでお亡くなりを繰り返していると思われる。これで環境構築が終わった。次回から、本格的にゼロから始めるOS自作入門の内容に入ろうと思う。
というかbootloader_apiのドキュメント見てるけどこれ文字出力できなくないか?俺はこれからどうやって文字を出力したらいいのだろうか...。
2. ピクセル描画(4章)
前回の状態だと何もわからずにブートを繰り返していたが、問題としてはprintln
が存在しないVGAテキストバッファに書き込もうとしてページフォルトを起こし、パニックハンドラにもprint
があるため結果としてリブートが起こったと思われる。
取り敢えず本で実装していない領域はコメントアウトしようと思うが、パニックしたことは知りたいのでパニックハンドラにはprint
を残そうと思う。
ここでは、BootInfo
のOptional<FrameBuffer>
をラッピングする構造体を作った。
BootInfo
# main.rs
let BootInfo {
framebuffer,
..
} = boot_info;
let frame_buffer_info = framebuffer.as_ref().unwrap().info();
let mut display = Display::new(framebuffer.as_mut().unwrap().buffer_mut(), frame_buffer_info);
# display.rs
pub struct Display {
buffer: &'static mut [u8],
pub info: FrameBufferInfo,
}
impl Display {
pub fn new(buffer: &'static mut [u8], info: FrameBufferInfo) -> Self {
Self {
buffer,
info,
}
}
}
Optional<T>
の扱いはこれで大丈夫かな?正直分かってないのでアドバイスあったらほしいです。
正直そのほかの実装で面白そうなところはないので大丈夫だと思います。