Open9
ゼロからのOS自作入門をRustでやってみる
とりあえず3章までは終わっているので、ここからのスタート
4章 ピクセル描画とmake入門
frame_bufferの開始アドレスとか、各種設定とか、ブートローダーとkernel両方から参照するものをcommonに切り出す
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
とりあえず、core
とはこれ。
標準ライブラリ(std)の基本部分を提供するRustの低レベルライブラリ。
組み込み環境など、stdが使えない環境(no_std)で利用されることを想定しているらしい。
こいつが重複しているのはなぜ?
std経由で入っている?
which `std` depends on
ブートローダーはno_stdだけど、commonはno_stdじゃないからそれか?
とりあえず、commonにno_stdつけたらエラーは治った
何で起こってたのか、なんで治ったのかまだ理解できてないけど...
commonをブートローダー、カーネルで利用するように修正した。
しかし、画面に何も描画されない 😢
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 } } }