LoginSignup
0
0

Writing OS in Rustの写経が終わったので続けていじってみる

Last updated at Posted at 2024-05-12

初めに

この記事では、最終的にWriting OS in RustとゼロからのOS自作入門を合体したようなOSが出来ることを目標としています。私は対してRustに詳しいわけでもOSに詳しいわけでもないただ面白そうというだけで来た人間なので理解がガバガバな面もあると思うので変なことを言っていたらコメントいただけると助かります。(失踪しないよう頑張ります)
Writing OS in Rust

1. UEFIブートへの対応

今回、Writing OS in Rustで使用していたbootloaderがバージョンアップによりUEFIブートに対応したとのことなので、これを利用したいと思う。

参考サイト群

やったこと

diff

今回、ディスクイメージ作成の項を読み我々が作成してきた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を残そうと思う。
ここでは、BootInfoOptional<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>の扱いはこれで大丈夫かな?正直分かってないのでアドバイスあったらほしいです。
正直そのほかの実装で面白そうなところはないので大丈夫だと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0