DEV Community

loading...

Rustで自作OS 6日目

YT
・2 min read

引き続き第3章 boot loaderを進める。
https://os.phil-opp.com/ja/minimal-rust-kernel/#kaneruwoshi-xing-suru
bootloader crateというものがあるらしいけど、まずは自作を試みる。
でも参考にはする。

私達のカーネルをELFファイルにコンパイルする。
依存であるbootloaderをスタンドアロンの実行ファイルとしてコンパイルする。
カーネルのELFファイルのバイト列をブートローダーにリンクする。

たぶんリンクはlld、それ以外はcargo(rustc)で進める。

まずはELF形式のカーネルをビルドする。
ビルド設定をtarget.jsonとして作成する。

{
  "llvm-target": "x86_64-unknown-none",
  "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
  "arch": "x86_64",
  "target-endian": "little",
  "target-pointer-width": "64",
  "target-c-int-width": "32",
  "os": "none",
  "executables": true,
  "linker-flavor": "ld.lld",
  "linker": "rust-lld",
  "panic-strategy": "abort",
  "disable-redzone": true,
  "features": "-mmx,-sse,+soft-float",
  "exe-suffix": ".elf"
}
Enter fullscreen mode Exit fullscreen mode

コマンド build --target target.json --package kernel --bin kernel でビルドできる。
macOSの場合、binutilsのgreadelfでバイナリを確認できる。

$ brew install binutils
$ /usr/local/Cellar/binutils/2.36.1/bin/greadelf -h ../target/target/debug/kernel.elf
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x201120
  Start of program headers:          64 (bytes into file)
  Start of section headers:          4472 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         4
  Size of section headers:           64 (bytes)
  Number of section headers:         15
  Section header string table index: 13
Enter fullscreen mode Exit fullscreen mode

Entry point addressが自作OS本とは合っていないが、とりあえずboot loaderにカーネルを読み込む処理を実装する。

調べてたら先駆者を見つけた。
https://natsutan.hatenablog.com/entry/2021/04/14/190451
この人はCのUEFIアプリからRustのカーネルを読んでいるようだけど、自分は全部Rustでやってみたい。

上記ブログの参考ブログは全部Rustでやってた。
https://www.akiradeveloper.com/post/mikanos-rust/

このカーネルファイルは、0x100000に配置されるようにビルドされているため、 UEFIによってアドレス指定方式でページをアロケートして、そこに書きます。

これが全てっぽい。

自作OS本と https://github.com/akiradeveloper/MikanOS.rs/blob/master/boot/src/main.rs を見ながら進める。

一通り書いた時点で起動してみると、QEMUがpanicした。

Screen_Shot_2021-07-11_at_17_48_28

ディレクトリ構成を修正すると、panicせず起動できたようだ。

Screen Shot 2021-07-11 at 18.13.06

Screen Shot 2021-07-11 at 18.12.46

今日の進捗 -> https://github.com/ytannai/kabos/tree/8e5091cbb471ca660dab44091051d79d692692c2

Discussion (0)