Rcore-Tutorial Version 3.6. Siehe die Dokumentation in Chinesisch.
Rcore-Tutorial API-Dokumente. Siehe die API -Dokumente von zehn Osen
Wenn Sie Rust Sprache nicht kennen und versuchen, sie zu lernen, besuchen Sie bitte Rust Learning Resources
Offizielle QQ -Gruppennummer: 735045051
Dieses Projekt soll zeigen, wie ein UNIX-ähnliches Betriebssystem schreibt, das auf RISC-V -Plattformen von Grund auf Rost für Anfänger ausgeführt wird, ohne Hintergrundkenntnisse über Computerarchitekturen, Montagesprachen oder Betriebssysteme .
qemu-system-riscv64 -Simulator- oder Dev-Boards basierend auf Kendryte K210 SoC wie Maix DockSiehe offiziellen Leitfaden.
Installieren Sie einige Werkzeuge:
$ 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-srcHier kompilieren und installieren wir QEMU 7.0.0 manuell. Zum Beispiel auf 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 ) Fügen Sie dann den folgenden Inhalt zu ~/.bashrc hinzu (passen Sie diese Pfade entsprechend Ihrer Umgebung an):
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
Schließlich aktualisieren Sie die aktuelle Shell:
$ source ~ /.bashrcJetzt können wir die Version von QEMU überprüfen:
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developersLaden Sie die komprimierte Datei gemäß Ihrer Plattform von der Sifive -Website (Strg+F 'Toolchain') herunter.
Extrahieren Sie es und fügen Sie den Standort des "Bin" -Verzeichnungsverzeichnisses unter seinem Root -Verzeichnis $PATH an.
Zum Beispiel können wir die Version von GDB überprüfen:
$ 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 runNachdem Sie einige Debug -Nachrichten ausgegeben haben, listet der Kernel alle verfügbaren Anwendungen auf und geben Sie die Benutzerschale ein:
/**** 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
>>
Sie können jede Anwendung mit Ausnahme von initproc und user_shell selbst ausführen. Um eine Anwendung auszuführen, geben Sie einfach ihren Dateinamen ein und drücken Sie die Eingabetaste. usertests können eine Reihe von Anwendungen ausführen, daher wird dies empfohlen.
Geben Sie Ctrl+a dann x , um QEMU zu beenden.
Vor Kapitel 6 benötigen Sie keine SD -Karte:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210Vor Kapitel 6 sollten wir vor dem Ausführen des Kernels eine SD -Karte in den PC einfügen und das Dateisystembild manuell darauf schreiben:
$ cd rCore-Tutorial-v3/os
$ make sdcard Standardmäßig überschreiben Sie das Gerät /dev/sdb , das die SD -Karte ist. Sie können jedoch einen anderen Ort angeben. make sdcard SDCARD=/dev/sdc .
Entfernen Sie danach die SD -Karte vom PC und setzen Sie sie in den Steckplatz von K210 ein. Schließen Sie den K210 an PC an und dann:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210 Geben Sie Ctrl+] zum Trennen von K210 ein.
Der Zweig von CH9-Log enthält viele Debug-Informationen. Sie könnten versuchen, das RCORE -Tutorial auszuführen, um das interne Verhalten von OS -Kernel zu verstehen.
$ 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
...... Derzeit kann es Ihnen nur helfen, den Code anzusehen, da nur ein winziger Teil des Code dokumentiert wurde.
Sie können ein Dokument HTML os mit cargo doc --no-deps --open im os Verzeichnis eröffnen.
Die API -Dokumente für zehn Betriebssysteme
Unsere erste Veröffentlichung 3.6.0 (Kapitel 1-9) wurde veröffentlicht, und wir arbeiten noch daran.
Hier sind die Updates seit 3.5.0:
power Series Application In frühen Kapiteln finden Sie einen Modul in der Ausgabe UPSafeCell anstelle von RefCell oder spin::Mutex , um auf statische Datenstrukturen zuzugreifen und deren API so anzupassen, dass sie nicht zweimal geliehen werden kann (Erwähnung & .exclusive_access().task[0] in run_first_task ) TaskContext in TaskControlBlock , anstatt sie auf Kernel Stack (seit CH3) wiederherzustellen, wodurch ärgerliche task_cx_ptr2 beseitigt wird llvm_asm! mit asm! rcore-fs-fuse generierte FS-Bildgröße auf 128Mib huge_write hinzu, der die FS -Leistung bewertet (QEMU ~ 500KIB/S K210 ~ 50 KIB/S) spin::Mutex durch UPSafeCell vor dem SMP -Kapitel find_pte anstelle von find_pte_create in PageTable::unmap aufrufen find_pte anstatt sie außerhalb dieser Funktion zu überprüfen" sollte kein Fehler sein cargo doc --no-deps --open verwenden, um die Dokumentation einer Kiste anzuzeigen Wir werden sie später hinzufügen.