Open9

ゼロからのOS自作入門をRustでやってみる

sikinatmsikinatm

4章 ピクセル描画とmake入門

sikinatmsikinatm

frame_bufferの開始アドレスとか、各種設定とか、ブートローダーとkernel両方から参照するものをcommonに切り出す

sikinatmsikinatm

commonをブートローダーから読み込んでビルドすると、こんな感じのエラーが出るように...

error[E0152]: duplicate lang item in crate `core` (which `std` depends on): `sized`
  |
  = note: the lang item is first defined in crate `core` (which `make_mikan_os_boot_loader` depends on)
  = note: first definition in `core` loaded from /IdeaProjects/make-mikan-os/boot-loader/target/x86_64-unknown-uefi/debug/deps/libcore-befb811bf5037789.rlib
  = note: second definition in `core` loaded from /root/.rustup/toolchains/nightly-aarch64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-uefi/lib/libcore-2b7b408b124de8bc.rlib
sikinatmsikinatm

とりあえず、core とはこれ。
https://doc.rust-lang.org/core/

標準ライブラリ(std)の基本部分を提供するRustの低レベルライブラリ。
組み込み環境など、stdが使えない環境(no_std)で利用されることを想定しているらしい。

こいつが重複しているのはなぜ?

sikinatmsikinatm

2つの事実を確認した

  • ブートローダーからカーネルに渡した構造体にメンバ関数を生やし、カーネル側で呼び出すと失敗
  • カーネル側で以下のようなメソッドを呼び出すと失敗
    pub struct PixelColor {
      pub r: u8,
      pub g: u8,
      pub b: u8,
    }
    
    impl PixelColor {
      // これ
      pub fn new(r: u8, g: u8, b: u8) -> Self {
          Self { r, g, b }
      }
    }