RCORE-Tutorialバージョン3.6。中国語のドキュメントを参照してください。
RCORE-Tutorial APIドキュメント。 10個のOSのAPIドキュメントを参照してください
錆言語がわからず、学習しようとしている場合は、Rust Learning Resourcesにアクセスしてください
公式QQグループ番号:735045051
このプロジェクトの目的は、コンピューターアーキテクチャ、アセンブリ言語、またはオペレーティングシステムに関する背景の知識なしに、RISC-VプラットフォームでRISC-Vプラットフォームで実行されているUNIXのようなOSをrustで錆びて書く方法を示すことを目的としています。
qemu-system-riscv64シミュレーターまたはMaix DockなどのKendryte K210 SoCに基づくDevボード公式ガイドを参照してください。
いくつかのツールをインストールします:
$ rustup target add riscv64gc-unknown-none-elf
$ cargo install cargo-binutils --vers =0.3.3
$ rustup component add llvm-tools-preview
$ rustup component add rust-srcここでは、QEMU 7.0.0を手動でコンパイルしてインストールします。たとえば、ubuntu 18.04で:
# install dependency packages
$ sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev
gawk build-essential bison flex texinfo gperf libtool patchutils bc
zlib1g-dev libexpat-dev pkg-config libglib2.0-dev libpixman-1-dev git tmux python3 python3-pip
# download Qemu source code
$ wget https://download.qemu.org/qemu-7.0.0.tar.xz
# extract to qemu-7.0.0/
$ tar xvJf qemu-7.0.0.tar.xz
$ cd qemu-7.0.0
# build
$ ./configure --target-list=riscv64-softmmu,riscv64-linux-user
$ make -j $( nproc )次に、以下の内容を~/.bashrcに追加します(環境に応じてこれらのパスを調整してください):
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-softmmu
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-linux-user
最後に、現在のシェルを更新します。
$ source ~ /.bashrcこれで、QEMUのバージョンを確認できます。
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developersSifive Webサイト(Ctrl+F 'Toolchain')からプラットフォームに従って圧縮ファイルをダウンロードします。
それを抽出し、ルートディレクトリの下にある「bin」ディレクトリの場所を$PATHに追加します。
たとえば、GDBのバージョンを確認できます。
$ riscv64-unknown-elf-gdb --version
GNU gdb (SiFive GDB-Metal 10.1.0-2020.12.7) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html >
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.$ pip3 install pyserial
$ sudo apt install python3-serial$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make runいくつかのデバッグメッセージを出力した後、カーネルは利用可能なすべてのアプリケーションをリストし、ユーザーシェルを入力します。
/**** APPS ****
mpsc_sem
usertests
pipetest
forktest2
cat
initproc
race_adder_loop
threads_arg
race_adder_mutex_spin
race_adder_mutex_blocking
forktree
user_shell
huge_write
race_adder
race_adder_atomic
threads
stack_overflow
filetest_simple
forktest_simple
cmdline_args
run_pipe_test
forktest
matrix
exit
fantastic_text
sleep_simple
yield
hello_world
pipe_large_test
sleep
phil_din_mutex
**************/
Rust user shell
>>
initprocおよびuser_shell自体を除くアプリケーションを実行できます。アプリケーションを実行するには、ファイル名を入力してEnterを押します。 usertests多数のアプリケーションを実行できるため、推奨されます。
Ctrl+a入力してからxを終了します。
第6章の前に、SDカードは必要ありません。
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210第6章からカーネルを実行する前に、SDカードをPCに挿入し、ファイルシステムの画像を手動で書き込む必要があります。
$ cd rCore-Tutorial-v3/os
$ make sdcardデフォルトでは、SDカードであるデバイス/dev/sdbを上書きしますが、別の場所を提供できます。たとえば、 make sdcard SDCARD=/dev/sdc 。
その後、PCからSDカードを取り外し、K210のスロットに挿入します。 K210をPCに接続してから:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210 Ctrl+]を入力して、K210から切断します。
CH9-LOGのブランチには、多くのデバッグ情報が含まれています。 OSカーネルの内部動作を理解するために、RCOREチュートリアルを実行しようとすることができます。
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ git checkout ch9-log
$ make run
......
[rustsbi] RustSBI version 0.2.0-alpha.10, adapting to RISC-V SBI v0.3
.______ __ __ _______.___________. _______..______ __
| _ | | | | / | | / || _ | |
| | _) | | | | | | (---- ` --- | | ---- ` | (---- ` | | _) || |
| / | | | | | | | _ < | |
| | - ---. | ` -- ' |.----) | | | .----) | | |_) || |
| _| `._____| ______/ |_______/ |__| |_______/ |______/ |__|
[rustsbi] Implementation: RustSBI-QEMU Version 0.0.2
[rustsbi-dtb] Hart count: cluster0 with 1 cores
[rustsbi] misa: RV64ACDFIMSU
[rustsbi] mideleg: ssoft, stimer, sext (0x222)
[rustsbi] medeleg: ima, ia, bkpt, la, sa, uecall, ipage, lpage, spage (0xb1ab)
[rustsbi] pmp0: 0x10000000 ..= 0x10001fff (rw-)
[rustsbi] pmp1: 0x2000000 ..= 0x200ffff (rw-)
[rustsbi] pmp2: 0xc000000 ..= 0xc3fffff (rw-)
[rustsbi] pmp3: 0x80000000 ..= 0x8fffffff (rwx)
[rustsbi] enter supervisor 0x80200000
[KERN] rust_main() begin
[KERN] clear_bss() begin
[KERN] clear_bss() end
[KERN] mm::init() begin
[KERN] mm::init_heap() begin
[KERN] mm::init_heap() end
[KERN] mm::init_frame_allocator() begin
[KERN] mm::frame_allocator::lazy_static!FRAME_ALLOCATOR begin
...... 現在、コードのごく一部のみが文書化されているため、コードを表示するのにのみ役立ちます。
cargo doc --no-deps --open os DirectoryでOPEを使用してosのDOC HTMLを開くことができます。
10 OSのAPIドキュメント
最初のリリース3.6.0(第1-9章)が公開されており、私たちはまだそれに取り組んでいます。
3.5.0以降の更新は次のとおりです。
powerシリーズアプリケーションを初期の章で修正すると、出力でモジュラスを見つけることができますRefCellまたはspin::Mutexの代わりにUPSafeCellを使用して、静的データ構造にアクセスしてAPIを調整して、一度に2回借りることができないようにAPIを調整します(&.exclusive_access()。 run_first_taskの& .exclusive_access().task[0] ) TaskContext Kernel Stackで所定の位置に復元する代わりにTaskControlBlockに移動します(CH3以降)、迷惑なtask_cx_ptr2を排除しますllvm_asm! asm! rcore-fs-fuseで生成されたFS画像サイズを128mibに拡張しますhuge_writeという名前の新しいテストを追加します(qemu〜500kib/s k210〜50kib/s) spin::Mutex UPSafeCellに置き換えますPageTable::unmapでfind_pte_createではなくfind_pteに電話する必要がありますfind_pteでレベル3 PTEの妥当性を確認する」バグではないはずですcargo doc --no-deps --open木枠のドキュメントを表示できます後で追加します。