RCORE-tutorial version 3.6. Voir la documentation en chinois.
RCORE-tutorial API Docs. Voir les documents API de dix OS
Si vous ne connaissez pas la langue de la rouille et essayez de l'apprendre, veuillez visiter Rust Learning Resources
Numéro officiel du groupe QQ: 735045051
Ce projet vise à montrer comment rédiger un système d'exploitation de type Unix fonctionnant sur les plates-formes RISC-V à partir de zéro à Rust pour les débutants sans aucune connaissance de base sur les architectures informatiques, les langages d'assemblage ou les systèmes d'exploitation .
qemu-system-riscv64 ou Dev Board Basé sur Kendryte K210 SOC tel que Maix DockVoir Guide officiel.
Installez certains outils:
$ 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-srcIci, nous compilons et installons manuellement Qemu 7.0.0. Par exemple, sur 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 ) Ensuite, ajoutez le contenu suivant à ~/.bashrc (veuillez ajuster ces chemins en fonction de votre environnement):
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
Enfin, mettez à jour le shell actuel:
$ source ~ /.bashrcNous pouvons maintenant vérifier la version de Qemu:
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developersTéléchargez le fichier compressé en fonction de votre plate-forme à partir du site Web SiFive (Ctrl + F 'Toolchain').
Extrairez-le et ajoutez l'emplacement du répertoire «bin» sous son répertoire racine à $PATH .
Par exemple, nous pouvons vérifier la version de 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 runAprès avoir publié des messages de débogage, le noyau répertorie toutes les applications disponibles et entrez le shell utilisateur:
/**** 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
>>
Vous pouvez exécuter n'importe quelle application sauf pour initproc et user_shell lui-même. Pour exécuter une application, saisissez simplement son nom de fichier et appuyez sur ENTER. usertests peuvent exécuter un tas d'applications, il est donc recommandé.
Tapez Ctrl+a puis x pour quitter qemu.
Avant le chapitre 6, vous n'avez pas besoin d'une carte SD:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210Du chapitre 6, avant d'exécuter le noyau, nous devons insérer une carte SD dans PC et écrire manuellement l'image du système de fichiers:
$ cd rCore-Tutorial-v3/os
$ make sdcard Par défaut, il écrasera le périphérique /dev/sdb qui est la carte SD, mais vous pouvez fournir un autre emplacement. Par exemple, make sdcard SDCARD=/dev/sdc .
Après cela, retirez la carte SD du PC et insérez-la à la fente de K210. Connectez le K210 à PC puis:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210 Tapez Ctrl+] pour se déconnecter de K210.
La branche de CH9-log contient beaucoup d'informations de débogage. Vous pouvez essayer d'exécuter le tutoriel RCORE pour comprendre le comportement interne du noyau OS.
$ 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
...... Actuellement, il ne peut que vous aider à afficher le code car seule une petite partie du code a été documentée.
Vous pouvez ouvrir un doc html de os à l'aide cargo doc --no-deps --open sous le répertoire os .
L'API Docs pour dix os
Notre première version 3.6.0 (chapitre 1-9) a été publiée et nous y travaillons toujours.
Voici les mises à jour depuis 3.5.0:
power dans les premiers chapitres, vous pouvez maintenant trouver un module dans la sortie UPSafeCell au lieu de RefCell ou spin::Mutex afin d'accéder aux structures de données statiques et ajuster son API afin qu'elle ne puisse pas être empruntée deux fois à la fois (mention & .exclusive_access().task[0] dans run_first_task ) TaskContext dans TaskControlBlock au lieu de le restaurer en place sur la pile du noyau (depuis CH3), éliminant task_cx_ptr2 ennuyeux llvm_asm! avec asm! rcore-fs-fuse à 128mib huge_write qui évalue les performances FS (QEMU ~ 500KIB / S K210 ~ 50KIB / S) spin::Mutex par UPSafeCell avant le chapitre SMP find_pte plutôt que find_pte_create dans PageTable::unmap find_pte au lieu de le vérifier en dehors de cette fonction" ne devrait pas être un bug cargo doc --no-deps --open pour afficher la documentation d'une caisse Nous les ajouterons plus tard.