Slide 1

Slide 1 text

RustでRISC-Vをターゲットに ベアメタる @LDScell 2018/11/26 RustのLT会!Rust入門者の集い #6

Slide 2

Slide 2 text

自己紹介 • @LDScell • tomoyuki-nakabayashi(github) – 孤独に、黙々と、 Rustでベアメタってます

Slide 3

Slide 3 text

Motivation • 目指せ孤独脱出!

Slide 4

Slide 4 text

Background • ベアメタルプログラミング (no_std)とは? • RISC-Vとは? – オープンなCPUの命令セット – CPU自作して販売しても合法 CPU (Metal) OS library apps CPU (Metal) apps

Slide 5

Slide 5 text

Rust 1.30リリース! (2018/10) • `no_std` applications – #![no_std]自体は1.6からstableだったが、 #[panic_handler]が追従せず、stableではライブラ リしか作れなかった • Added RISC-V target compiler – riscv32imc-unknown-none-elf

Slide 6

Slide 6 text

stableでRISC-Vベアメタれる! • Hello world! • お作法

Slide 7

Slide 7 text

stableでRISC-Vベアメタれる! • ね、簡単でしょ? 良い子はUARTのTXバッファがFullでないかのチェックをしよう!

Slide 8

Slide 8 text

後は・・・

Slide 9

Slide 9 text

ちょっとアセンブリ書いて

Slide 10

Slide 10 text

ちょっとリンカスクリプト書いて

Slide 11

Slide 11 text

ちょっとcargoの設定書いて

Slide 12

Slide 12 text

ちょっとbuild script書いて

Slide 13

Slide 13 text

cargo runで完了! RISC-Vエミュレータの実行結果 めっちゃ簡単にベアメタれるやん! ※stableでは、アセンブラにriscv-toolchain (gcc)が必要

Slide 14

Slide 14 text

そこで僕は考えた

Slide 15

Slide 15 text

RISC-V用のOS作ろう! (ある意味必然)

Slide 16

Slide 16 text

• Deviceの利用を排他制御したい • 原始的な方法⇒spin lock – Deviceが利用中であれば、ループして待つ CPU 絶賛困っていること 安全なHWアクセスを作りたい Thread 1 Thread 2 Device (Serial/Monitor)

Slide 17

Slide 17 text

spin crate They are usable without `std` and static initializers are available. no_stdでも利用可能なspin lock用crate ```:Cargo.toml [dependencies] spin = "0.4.10“ ``` https://crates.io/crates/spin

Slide 18

Slide 18 text

早速spin crateを使え・・・ない! $ cargo build 命令セットレベルの問題? RISC-Vは(x86と違って)、compare_and_swap命令 がない 鋭意調査中 めっちゃ辛そうなエラー

Slide 19

Slide 19 text

Conclusion • Rustでベアメタルプログラミング簡単にできる よ! • RISC-Vというイケイケの命令セットをターゲット にできるよ! • 軽い気持ちでベアメタろう! OS作ろう! • そして、錆ありベアメタルの群れを作ろう!